RE 求助闭关
查看原帖
RE 求助闭关
1171250
w132326820楼主2025/7/30 17:00
#include <bits/stdc++.h>
using namespace std;
const int N=200010;
int n,m,b[N],f[N][20],d[N],lg[N],rt[N],rn,idx,rv[N],bm[N],ss;
struct node{
    int l,r,val;
}a[N*40];
vector<int>v[N];
int get(int x){
    return lower_bound(b+1,b+1+n,x)-b;
}
int newnode(int x){
    a[++idx]=a[x];
    return idx;
}
int buildtree(int p,int l,int r){
    p=++idx;
    if(l==r)return p;
    int mid=(l+r)>>1;
    a[p].l=buildtree(p,l,mid);
    a[p].r=buildtree(p,mid+1,r);
    return p;
}
int add(int p,int l,int r,int x){
    p=newnode(p);
    a[p].val++;
    if(l==r)return p;
    int mid=(l+r)>>1;
    if(x<=mid)a[p].l=add(a[p].l,l,mid,x);
    else a[p].r=add(a[p].r,mid+1,r,x);
    return p;
}
int kth(int p,int q,int lp,int flp,int l,int r,int x){
    if(l==r)return b[l];
    int k=a[a[p].l].val+a[a[q].l].val-a[a[lp].l].val-a[a[flp].l].val,mid=(l+r)>>1;
    if(x<=k)return kth(a[p].l,a[q].l,a[lp].l,a[flp].l,l,mid,x);
    else return kth(a[p].r,a[q].r,a[lp].r,a[flp].r,mid+1,r,x-k);
}
void dfs(int x,int fa){
    d[x]=d[fa]+1;
    f[x][0]=fa;
    rt[rn+1]=add(rv[fa],1,ss,get(bm[x]));
    rv[x]=rt[rn+1];
    rn++;
    for(int i=1;i<=18;i++){
        f[x][i]=f[f[x][i-1]][i-1];
    }
    for(int i=0;i<v[x].size();i++){
        int u=v[x][i];
        if(u==fa)continue;
        dfs(u,x);
    }
}
int lca(int x,int y){
    if(d[x]<d[y])swap(x,y);
    while(d[x]>d[y])x=f[x][lg[d[x]-d[y]]];
    if(x==y)return x;
    for(int i=18;i>=0;i--){
        if(f[x][i]!=f[y][i]){
            x=f[x][i];
            y=f[y][i];
        }
    }
    return f[x][0];
}
int main(){
    cin>>n>>m;
    for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
    for(int i=1;i<=n;i++)cin>>b[i],bm[i]=b[i];
    for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    sort(b+1,b+1+n);
    ss=unique(b+1,b+1+n)-b-1;
    rv[0]=rt[0]=buildtree(0,1,ss);
    dfs(1,0);
    int lst=0;
    while(m--){
        int x,y,k;
        cin>>x>>y>>k;
        x^=lst;
        lst=kth(rv[x],rv[y],rv[lca(x,y)],rv[f[lca(x,y)][0]],1,ss,k);
        cout<<lst<<"\n";
    }
    return 0;
}
2025/7/30 17:00
加载中...