Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace std;
- using namespace __gnu_pbds;
- int d[100100], n, q,ans[100100];
- vector<vector<int>> g, req;
- vector<pair<int, int>>reqs;
- struct kek{int x; int y;kek(int _x, int _y) : x(_x), y(_y){}};
- typedef tree<
- pair<int, int>,
- null_type,
- less<pair<int, int>>,
- rb_tree_tag,
- tree_order_statistics_node_update>
- ordered_set;
- ordered_set subtrees;
- void init()
- {
- cin>>n>>q;
- g.resize(n); req.resize(n);
- for(int i = 0, u, v; i < n-1; ++i)
- {
- cin>>u>>v;
- g[--u].push_back(--v);
- g[v].push_back(u);
- }
- for(int i = 0, v, k; i < q; ++i)
- {
- cin>>v>>k;
- reqs.push_back({--v, --k});
- req[v].push_back(i);
- }
- }
- void calc_subtrees(int v, int pr = -1)
- {
- d[v] = 1;
- for (auto to : g[v]) if(to!=pr)calc_subtrees(to, v), d[v] += d[to];
- }
- void dfs(int v, int pr = -1)
- {
- if(pr!=-1)
- {
- subtrees.erase({d[v], v});
- subtrees.erase({n, pr});
- subtrees.insert({n, v});
- subtrees.insert({n - d[v], pr});
- }
- //cout<<"v = "<<v<<endl;
- //for(auto it : subtrees)cout<<"("<<it.first<<", "<<it.second<<") ";
- //cout<<endl;
- for(int req_n : req[v])
- {
- //ans.push_back({reqs[req_n].first, *subtrees.find_by_order(reqs[req_n].second)});
- ans[req_n] = (*subtrees.find_by_order(reqs[req_n].second)).first;
- }
- for(auto to : g[v])
- if(to!=pr)
- dfs(to, v);
- if(pr!=-1)
- {
- subtrees.erase({n - d[v], pr});
- subtrees.erase({n, v});
- subtrees.insert({n, pr});
- subtrees.insert({d[v], v});
- }
- }
- int main() {
- init();
- calc_subtrees(0);
- for(int i = 0; i < n; ++i) subtrees.insert({d[i], i});
- //for(auto it : subtrees)cout<<it.first<<" ";
- dfs(0);
- for(int i = 0; i < q; ++i)
- cout<<ans[i]<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement