92 pts求助 t了#11
查看原帖
92 pts求助 t了#11
684962
LINTONG1楼主2023/11/8 07:25
#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){
        if(ch=='-')w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<3)+(s<<1)+ch-'0';
        ch=getchar();
    }
    return s*w;
}
const int maxn=1e5+5;
struct tree{
    int to,nex;
}tr[maxn<<1];
int head[maxn<<1],cnt,n,q;
void add(int u,int v){
    tr[++cnt].to=v;
    tr[cnt].nex=head[u];
    head[u]=cnt;
}
int fa[maxn],son[maxn],siz[maxn],dep[maxn],dfn[maxn],top[maxn];
void dfs1(int x,int f){
    siz[x]=1;
    fa[x]=f;
    dep[x]=dep[f]+1;
    for(int i=head[x];i;i=tr[i].nex){
        int y=tr[i].to;
        if(y==f)continue;
        dfs1(y,x);
        siz[x]+=siz[y];
        if(siz[y]>siz[son[x]])son[x]=y;
    }
}
int tot;
void dfs2(int x,int f){
    top[x]=f;
    dfn[x]=++tot;
    if(!son[x])return;
    dfs2(son[x],x);
    for(int i=head[x];i;i=tr[i].nex){
        int y=tr[i].to;
        if(y==fa[x]||y==son[x])continue;
        dfs2(y,y);
    }
}
struct edgee{
    int ls,rs,mx,sum;
}e[maxn*40];
void updata(int root){
    e[root].sum=e[e[root].ls].sum+e[e[root].rs].sum;
}
int res=1;
void build(int root,int l,int r){
    if(l==r)return ;
    e[root].ls=++res;
    e[root].rs=++res;
    int mid=l+r>>1;
    build(e[root].ls,l,mid);
    build(e[root].rs,mid+1,r);
}
void insert(int now,int l,int r,int pos,int x){
    if(l==r){
        e[now].sum=x;
        return;
    }
    int mid=l+r>>1;
    if(pos<=mid)insert(e[now].ls,l,mid,pos,x);
    else insert(e[now].rs,mid+1,r,pos,x);
    updata(now);
}
int query_sum(int root,int l,int r,int L,int R){  
    if(L<=l&&r<=R)return e[root].sum;
    int mid=l+r>>1,ans=0;
    if(mid>=L)ans+=query_sum(e[root].ls,l,mid,L,R);
    if(mid<R)ans+=query_sum(e[root].rs,mid+1,r,L,R);
    return ans;
}
int rt[maxn*40],c[maxn];
int ask_sum(int x){
    int ans=0;
    while(!query_sum(1,1,n,dfn[top[x]],dfn[x])){       
        x=fa[top[x]];
    }
    if(query_sum(1,1,n,dfn[x],dfn[x]))return x;
    while(!query_sum(1,1,n,dfn[x],dfn[x]))x=fa[x];
    return x;
}
int w[maxn];
int main(){
    n=read(),q=read();
    for(int i=1;i<n;i++){
        int u=read(),v=read();
        add(u,v);add(v,u);
    }
    dfs1(1,0);dfs2(1,1);
    build(1,1,n);
    insert(1,1,n,1,1);
    while(q--){
        string op;
        cin>>op;
        int x=read();
        if(op=="Q"){
            cout<<ask_sum(x)<<"\n";
        }
        else insert(1,1,n,dfn[x],1);
    }
}
2023/11/8 07:25
加载中...