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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| int fa[N],siz[N],dep[N],son[N],top[N],idx; vector<int> g[N]; int w[N]; int n,m,q;
class persistent_segtree{ private: class starwish{ public: int l,r,c; }tr[N<<8]; int idx; public: int rt[N]; void build(int &u,int l,int r){ u = ++idx; if(l==r) return; int mid = (l+r)>>1; build(tr[u].l,l,mid); build(tr[u].r,mid+1,r); }
void modify(int u,int &v,int l,int r,int x,int c){ v = ++idx,tr[v] = tr[u]; tr[v].c += c; if(l==r) return; int mid = (l+r)>>1; if(x<=mid) modify(tr[u].l,tr[v].l,l,mid,x,c); else modify(tr[u].r,tr[v].r,mid+1,r,x,c); }
int Kth(int a,int b,int c,int d,int l,int r,int K){ if(l==r) return l; int mid = (l+r)>>1,w = tr[tr[a].l].c+tr[tr[b].l].c-tr[tr[c].l].c-tr[tr[d].l].c; if(w>=K) return Kth(tr[a].l,tr[b].l,tr[c].l,tr[d].l,l,mid,K); return Kth(tr[a].r,tr[b].r,tr[c].r,tr[d].r,mid+1,r,K-w); } }tr;
void dfs1(int u){ siz[u]++; for(auto v:g[u]){ if(v==fa[u]) continue; fa[v] = u; dep[v] = dep[u]+1; dfs1(v); siz[u] += siz[v]; if(siz[v]>siz[son[u]]) son[u] = v; } }
void dfs2(int u,int tp){ top[u] = tp; if(son[u]) dfs2(son[u],tp); for(auto v:g[u]){ if(v==fa[u]||v==son[u]) continue; dfs2(v,v); } }
inline int lca(int x,int y){ while(top[x]!=top[y]){ if(dep[top[x]]<dep[top[y]]) swap(x,y); x = fa[top[x]]; } if(dep[x]<dep[y]) swap(x,y); return y; }
vector<int> ha; inline int h(int x){ return lower_bound(ha.begin(),ha.end(),x)-ha.begin()+1; }
void dfs3(int u){ tr.modify(tr.rt[fa[u]],tr.rt[u],1,m,h(w[u]),1); for(auto v:g[u]){ if(v==fa[u]) continue; dfs3(v); } }
int main(){ n = in(),q = in(); for(int k=1;k<=n;k++) ha.push_back(w[k]=in()); sort(ha.begin(),ha.end()); ha.erase(unique(ha.begin(),ha.end()),ha.end()); m = ha.size(); for(int k=1;k<n;k++){ int a = in(),b = in(); g[a].push_back(b); g[b].push_back(a); } dfs1(1); dfs2(1,1); tr.build(tr.rt[0],1,m); dfs3(1); int lastans = 0; while(q--){ int x = in()^lastans,y = in(),K = in(); int d = lca(x,y); out(lastans=ha[tr.Kth(tr.rt[x],tr.rt[y],tr.rt[d],tr.rt[fa[d]],1,m,K)-1]); putchar('\n'); } return 0; }
|