Advertisement
Guest User

Untitled

a guest
Feb 19th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace std;
  5. using namespace __gnu_pbds;
  6.  
  7. int d[100100], n, q,ans[100100];
  8. vector<vector<int>> g, req;
  9. vector<pair<int, int>>reqs;
  10.  
  11. struct kek{int x; int y;kek(int _x, int _y) : x(_x), y(_y){}};
  12.  
  13. typedef tree<
  14.         pair<int, int>,
  15.         null_type,
  16.         less<pair<int, int>>,
  17.         rb_tree_tag,
  18.         tree_order_statistics_node_update>
  19.         ordered_set;
  20.  
  21. ordered_set subtrees;
  22.  
  23. void init()
  24. {
  25.     cin>>n>>q;
  26.     g.resize(n); req.resize(n);
  27.     for(int i = 0, u, v; i < n-1; ++i)
  28.     {
  29.         cin>>u>>v;
  30.         g[--u].push_back(--v);
  31.         g[v].push_back(u);
  32.     }
  33.     for(int i = 0, v, k; i < q; ++i)
  34.     {
  35.         cin>>v>>k;
  36.         reqs.push_back({--v, --k});
  37.         req[v].push_back(i);
  38.     }
  39. }
  40.  
  41. void calc_subtrees(int v, int pr = -1)
  42. {
  43.     d[v] = 1;
  44.     for (auto to : g[v]) if(to!=pr)calc_subtrees(to, v), d[v] += d[to];
  45. }
  46.  
  47. void dfs(int v, int pr = -1)
  48. {
  49.     if(pr!=-1)
  50.     {
  51.         subtrees.erase({d[v], v});
  52.         subtrees.erase({n, pr});
  53.         subtrees.insert({n, v});
  54.         subtrees.insert({n - d[v], pr});
  55.     }
  56.     //cout<<"v = "<<v<<endl;
  57.     //for(auto it : subtrees)cout<<"("<<it.first<<", "<<it.second<<") ";
  58.     //cout<<endl;
  59.     for(int req_n : req[v])
  60.     {
  61.         //ans.push_back({reqs[req_n].first, *subtrees.find_by_order(reqs[req_n].second)});
  62.         ans[req_n] = (*subtrees.find_by_order(reqs[req_n].second)).first;
  63.     }
  64.     for(auto to : g[v])
  65.         if(to!=pr)
  66.             dfs(to, v);
  67.  
  68.     if(pr!=-1)
  69.     {
  70.         subtrees.erase({n - d[v], pr});
  71.         subtrees.erase({n, v});
  72.         subtrees.insert({n, pr});
  73.         subtrees.insert({d[v], v});
  74.     }
  75. }
  76.  
  77. int main() {
  78.     init();
  79.     calc_subtrees(0);
  80.     for(int i = 0; i < n; ++i) subtrees.insert({d[i], i});
  81.     //for(auto it : subtrees)cout<<it.first<<" ";
  82.     dfs(0);
  83.     for(int i = 0; i < q; ++i)
  84.         cout<<ans[i]<<endl;
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement