悬关MLE+RE20pts
查看原帖
悬关MLE+RE20pts
749175
114514xxx楼主2025/1/22 19:20
#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,f[N][30];
struct SegTree{
    int l,r,val;
}t[N>>8];

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){
    dep[u]=dep[fat]+1;
    fa[u]=fat;
    f[u][0]=fa[u];
    for(int i=head[u];i;i=edge[i].next){
        int v=edge[i].to;
        if(v==fat)continue;
        dfs1(v,u);
    }
}
inline void dfs2(int u){
    root[u]=modify(root[fa[u]],1,len,pval[u]);
    for(int i=head[u];i;i=edge[i].next){
        int v=edge[i].to;
        if(v==fa[u])continue;
        dfs2(v);
    }
}
int Lca(int x,int y){
    if (dep[x]<dep[y]) swap(x,y);
    for (int i=18;i>=0;--i)
        if (dep[f[x][i]]>=dep[y])
            x=f[x][i];
    if (x==y) return y;
    for (int i=18;i>=0;--i)
        if (f[x][i]!=f[y][i])
            x=f[x][i],y=f[y][i];
    return fa[x];
}
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[l];
    int mid=(l+r)>>1;
    int 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.tie(0),cout.tie(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);
    for (int i=1;i<=18;++i)
        for (int j=1;j<=n;++j)
            f[j][i]=f[f[j][i-1]][i-1];
    dfs2(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);
        //cout<<root[u]<<' '<<root[v]<<' '<<root[lca]<<' '<<root[fa[lca]]<<' '<<len<<endl;
        lastans=query(root[u],root[v],root[lca],root[fa[lca]],1,len,k);
        cout<<lastans<<'\n';
    }
}
2025/1/22 19:20
加载中...