fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. vector<vector<int>> adj;
  5. vector<int> dp;
  6. vector<int> euler;
  7. vector<int> tin;
  8.  
  9. void dfs(int node, int par) {
  10. tin[node] = euler.size();
  11. euler.push_back(node);
  12.  
  13. dp[node] = 1;
  14.  
  15. for (int child : adj[node]) {
  16. if (child != par) {
  17. dfs(child, node);
  18. dp[node] += dp[child];
  19. }
  20. }
  21. }
  22.  
  23. int main() {
  24. int m;
  25. cin >> m;
  26.  
  27. adj.resize(m + 1);
  28. dp.resize(m + 1);
  29. tin.resize(m + 1);
  30.  
  31. for (int i = 0; i < m - 1; i++) {
  32. int u, v;
  33. cin >> u >> v;
  34. adj[u].push_back(v);
  35. adj[v].push_back(u);
  36. }
  37.  
  38. // sort children
  39. for (int i = 1; i <= m; i++) {
  40. sort(adj[i].begin(), adj[i].end());
  41. }
  42.  
  43. // Euler DFS
  44. dfs(1, 0);
  45.  
  46. int q;
  47. cin >> q;
  48.  
  49. while (q--) {
  50. int n, k;
  51. cin >> n >> k;
  52.  
  53. if (k > dp[n]) {
  54. cout << -1 << "\n";
  55. } else {
  56. cout << euler[tin[n] + k - 1] << "\n";
  57. }
  58. }
  59.  
  60. return 0;
  61. }
  62.  
Success #stdin #stdout 0.01s 5276KB
stdin
7
1 2
1 3
2 4
2 5
3 6
3 7
6
1 1
1 4
2 3
3 2
4 1
3 5
stdout
1
5
5
6
4
-1