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
| vector<int> X; int n,m,L; int a[MAXN],fa[MAXN]; int s[N],ls[N],rs[N],cnt,root[MAXN]; void insert(int pre,int &rt,int l,int r,int val) { if(!rt)rt=++cnt; s[rt]=s[pre]+1; if(l==r)return; if(val<=mid)insert(ls[pre],ls[rt],l,mid,val),rs[rt]=rs[pre]; else insert(rs[pre],rs[rt],mid+1,r,val),ls[rt]=ls[pre]; } int query(int pre,int rt1,int rt2,int l,int r,int k) { if(l==r)return l; int t=s[ls[rt1]]+s[ls[rt2]]-2*s[ls[pre]]+(a[L]>=l&&a[L]<=mid); if(t>=k)return query(ls[pre],ls[rt1],ls[rt2],l,mid,k); else return query(rs[pre],rs[rt1],rs[rt2],mid+1,r,k-t); } void dfs(int u,int par=0) { fa[u]=par,insert(root[par],root[u],1,X.size(),a[u]); go(u)if(v!=par)dfs(v,u); } int work() { scanf("%d%d",&n,&m); fp(i,1,n)scanf("%d",&a[i]),X.pb(a[i]); sort(all(X)),unq(X); fp(i,1,n)a[i]=lb(all(X),a[i])-X.begin()+1; fp(i,1,n-1) { int u,v;scanf("%d%d",&u,&v); addedge(u,v),addedge(v,u); } dfs(1,0),lca::init(n); while(m--) { int u,v,k;scanf("%d%d%d",&u,&v,&k),L=lca::query(u,v); printf("%d\n",X[query(root[L],root[u],root[v],1,X.size(),k)-1]); } return 0; }
|