1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using ordered_set = tree<int, null_type, less<>, rb_tree_tag, tree_order_statistics_node_update>;
class Solution { public: vector<int> kthSmallest(vector<int>& par, vector<int>& vals, vector<vector<int>>& queries) { vector<vector<int> > g(par.size()+5); vector<vector<array<int,2> > > que(par.size()+5); for(int i=1;i<par.size();++i){ g[par[i]].push_back(i); } for(int i=0;i<queries.size();++i){ que[queries[i][0]].push_back({queries[i][1],i}); } vector<int> ans(queries.size()); auto dfs=[&](auto &&self,int u,int val) -> ordered_set*{ val^=vals[u]; ordered_set* st=new ordered_set(); st->insert(val); for(auto v:g[u]){ ordered_set* t=self(self,v,val); if(t->size()>st->size()){ swap(st,t); } for (int k : *t) { st->insert(k); } delete t; } for(auto &t:que[u]){ int k=t[0],idx=t[1]; if(k>st->size()){ ans[idx]=-1; continue; } ans[idx]=*st->find_by_order(k-1); } return st; }; dfs(dfs,0,0); return ans; } };
|