主席树RE#2#3求助
查看原帖
主席树RE#2#3求助
812227
Sunrise_beforeglow楼主2025/8/2 12:13
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5;
int n,m,a[N];
map<int,int>mp;
int sl[N<<6],sr[N<<6],sum[N<<6],tot,siz,u,v,k,last=0;
vector<int>g[N];
int f[N],root[N],dep[N];
int pa[N][25];
int build(int l,int r)
{
    int u=++tot;
    sum[u]=0;
    if(l<r)
    {
        int mid=(l+r)/2;
        sl[u]=build(l,mid);
        sr[u]=build(mid+1,r);
    }
    return u;
}
int insert(int x,int l,int r,int pos)
{
    int u=++tot;
    sl[u]=sl[x],sr[u]=sr[x],sum[u]=sum[x]+1;
    if(l<r)
    {
        int mid=(l+r)/2;
        if(pos<=mid)sl[u]=insert(sl[x],l,mid,pos);
        else sr[u]=insert(sr[x],mid+1,r,pos);
    }
    return u;
}
void dfs(int x,int fa)
{
    pa[x][0]=fa;
    for(int i=1;i<=20;i++)pa[x][i]=pa[pa[x][i-1]][i-1];
    root[x]=insert(root[fa],1,siz,a[x]);
    for(auto i:g[x])
    {
        if(i==fa)continue;
        dep[i]=dep[x]+1;
        dfs(i,x);
    }
}
int lca(int x,int y)
{
    if(dep[x]<dep[y])swap(x,y);
    int tmp=dep[x]-dep[y];
    for(int i=20;i>=0;i--)if((tmp>>i)&1)x=pa[x][i];
    if(x==y)return x;
    for(int i=20;i>=0;i--)
    {
        if(pa[x][i]!=pa[y][i])
        {
            x=pa[x][i];
            y=pa[y][i];
        }
    }
    return pa[x][0];
}
int query(int x,int y,int u,int v,int k,int l,int r)
{
    if(l==r)return l;
    int s=sum[sl[u]]+sum[sl[v]]-sum[sl[x]]-sum[sl[y]];
    int mid=(l+r)/2;
    if(s<k)return query(sr[x],sr[y],sr[u],sr[v],k-s,mid+1,r);
    else return query(sl[x],sl[y],sl[u],sl[v],k,l,mid);
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i],mp[a[i]]=1;
    for(auto &i:mp)i.second=++siz,f[siz]=i.first;
    for(int i=1;i<=n;i++)a[i]=mp[a[i]];
    for(int i=1;i<n;i++)
    {
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    root[0]=build(1,siz);
    dfs(1,0);
    while(m--)
    {
        cin>>u>>v>>k;
        u^=last;
        int op=lca(u,v);
        last=f[query(root[pa[op][0]],root[op],root[u],root[v],k,1,siz)];
        cout<<last<<"\n";
    }
    return 0;
}
2025/8/2 12:13
加载中...