比赛 20240913练习 评测结果 AAAAA
题目名称 白黑树 最终得分 100
用户昵称 djyqjy 运行时间 0.702 s
代码语言 C++ 内存使用 12.50 MiB
提交时间 2024-09-13 21:54:04
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int ver[2*N],nxt[2*N],hd[N];
int jsq=1;
void add_edge(int x,int y)
{
    ver[++jsq]=y;
    nxt[jsq]=hd[x];
    hd[x]=jsq;
    return;
}
int n,m;
int f[N][25];
int dfn[N];
int jsqdfn;
int sz[N];
void dfs(int x,int fa)
{
    sz[x]=1;
    f[x][0]=fa;
    for(int i=1;i<=22;i++)
        f[x][i]=f[f[x][i-1]][i-1];
    dfn[x]=++jsqdfn;
    for(int i=hd[x];i;i=nxt[i])
    {
        int y=ver[i];
        if(y==fa) continue;
        dfs(y,x);
        sz[x]+=sz[y];
    }
    return;
}
int c[N];
void add(int w,int z)
{
    while(w<=N-5)
    {
        c[w]+=z;
        w+=w&-w;
    }
    return;
}
int q(int w)
{
    if(w==0) return 0;
    int ans=0;
    while(w)
    {
        ans+=c[w];
        w-=w&-w;
    }
    return ans;
}
int query(int x)
{
    int bls=q(n);
    if(bls==0) return -1;
    if(q(dfn[x]+sz[x]-1)-q(dfn[x]-1)==bls) return x;
    for(int i=20;i>=0;i--)
        if(f[x][i]&&q(dfn[f[x][i]]+sz[f[x][i]]-1)-q(dfn[f[x][i]]-1)!=bls) x=f[x][i];
    return f[x][0];
}
char ch;
int main()
{
    freopen("C_Tree.in","r",stdin);
    freopen("C_Tree.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1,x,y;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        add_edge(x,y);
        add_edge(y,x);
    }
    dfs(1,0);
    for(int i=1,x;i<=m;i++)
    {
        cin>>ch;
        scanf("%d",&x);
        if(ch=='M')
        {
            if(q(dfn[x])-q(dfn[x]-1)==0) add(dfn[x],1);
            else add(dfn[x],-1);
        }
        else if(ch=='Q') printf("%d\n",query(x));
    }
    return 0;
}