思路:离线做法,并查集(弱弱我一开始想到了用并查集,但是不知道怎么在线处理,后来看了题解之后恍然大悟捏)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
vector<int>f[N];
typedef pair<char,int>PII;
PII temp[N];
int p[N];
int cnt[N],ans[N];
int fa[N];
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
void dfs(int father,int cur)
{
for(auto v:f[cur])
{
if(v==father) continue;
fa[v]=cur;
if(cnt[v]==0) p[v]=cur;//处理一下祖宗节点,如果有标记就不用更新了
dfs(cur,v);
}
}
void solve()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n-1;i++)
{
int u,v;
cin>>u>>v;
f[u].push_back(v);
f[v].push_back(u);
}
for(int i=1;i<=n;i++) p[i]=i;
cnt[1]=1;
for(int i=1;i<=q;i++)
{
char c;
int x;
cin>>c>>x;
temp[i]={c,x};//存一下操作
if(c=='C') cnt[x]++;
}
dfs(0,1);
int tot=0;
for(int i=q;i>=1;i--)
{
char c=temp[i].first;
int x=temp[i].second;
if(c=='Q')
{
int u=find(x);
ans[++tot]=u;
}
else
{
cnt[x]--;
if(!cnt[x]) p[x]=fa[x];
}
}
for(int i=tot;i>=1;i--) cout<<ans[i]<<"\n";//注意要倒序输出
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
int T=1;
while(T--){solve();}
return 0;
}