悬关,样例没过
查看原帖
悬关,样例没过
749175
114514xxx楼主2025/1/21 19:56
#include<bits/stdc++.h>
#define ls t[p].l
#define rs t[p].r
using namespace std;
const int N=1e5+25;
struct Edge{
    int to,next;
}edge[N*2];
int pval[N];
int head[N],cnt,n,m,b[N];
int fa[N],dep[N],son[N],siz[N];
int top[N],dfn[N],rnk[N],dfnx;
int segt,root[N],len;
struct SegTree{
    int l,r,val;
}t[N>>7];
inline void build(int &p,int l,int r){
    ++segt;
    if(l==r)return;
    int mid=(l+r)>>1;
    build(ls,l,mid),build(rs,mid+1,r);
}

int modify(int pre,int l,int r,int x)
{
    int p=++segt;
    t[p].val=t[pre].val+1;
    t[p].l=t[pre].l;
    t[p].r=t[pre].r;
    if (l==r) return p;
    int mid=(l+r)>>1;
    if (x<=mid) ls=modify(ls,l,mid,x);
    else rs=modify(rs,mid+1,r,x);
    return p;
}
inline void dfs1(int u,int fat){
    son[u]=-1,siz[u]=1;
    dep[u]=dep[fat]+1;
    fa[u]=fat;
    for(int i=head[u];i;i=edge[i].next){
        int v=edge[i].to;
        if(v==fat)continue;
        dfs1(v,u);
        siz[u]+=siz[v];
        if(son[u]==-1||siz[son[u]]<siz[v])son[u]=v;
    }
}
inline void dfs2(int u,int topf){
    top[u]=topf;
    root[u]=modify(root[fa[u]],1,len,pval[u]);
    if(son[u]==-1)return;
    dfs2(son[u],topf);
    for(int i=head[u];i;i=edge[i].next){
        int v=edge[i].to;
        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]])
            x=fa[top[x]];
        else y=fa[top[y]];
    }
    return dep[x]<dep[y]?x:y;
}
inline void add(int x,int y){
    edge[++cnt].to=y;
    edge[cnt].next=head[x];
    head[x]=cnt;
}
int query(int u,int v,int lca,int flca,int l,int r,int k){
    if (l==r) return b[pval[l]];
    int mid=(l+r)>>1,x=t[t[u].l].val+t[t[v].l].val-t[t[lca].l].val-t[t[flca].l].val;
    if (k<=x) return query(t[u].l,t[v].l,t[lca].l,t[flca].l,l,mid,k);
    else return query(t[u].r,t[v].r,t[lca].r,t[flca].r,mid+1,r,k-x);
}
int main(){
    ios::sync_with_stdio(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>pval[i],b[i]=pval[i];
    sort(b+1,b+1+n);
    len=unique(b+1,b+1+n)-b-1;
    for(int i=1;i<=n;i++)
        pval[i]=lower_bound(b+1,b+1+len,pval[i])-b;
    int x,y;
    for(int i=1;i<n;i++){
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    dfs1(1,0);
    dfs2(1,1);
    int u,v,k,lastans=0;
    for(int i=1;i<=m;i++){
        cin>>u>>v>>k;
        u^=lastans;
        int lca=Lca(u,v);
        lastans=query(root[u],root[v],root[lca],root[fa[lca]],1,len,k);
        cout<<lastans<<'\n';
    }
}
2025/1/21 19:56
加载中...