呜呜不知道哪里错了...
明明记得很熟的啊.....
#include <bits/stdc++.h>
using namespace std;
const int maxn=8e6+10;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
#define lson ls,l,mid
#define rson rs,mid+1,r
const int inf=1e9;
struct edge{
int to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){
d[++cnt] = (edge){v,head[u]},head[u]=cnt;
}
int n,m;
int fa[maxn],siz[maxn],deep[maxn],son[maxn];
int top[maxn],id[maxn],a[maxn],w[maxn],num,laz[maxn];
void dfs1(int u,int ff)
{
fa[u]=ff,siz[u]=1,deep[u]=deep[ff]+1;
for(int i=head[u];i;i=d[i].nxt )
{
int v=d[i].to;
if( v==ff ) continue;
dfs1(v,u);
siz[u]+=siz[v];
if( siz[son[u]]<siz[v] ) son[u]=v;
}
}
void dfs2(int u,int ffa)
{
top[u]=ffa,id[u]=++num;
if( son[u] ) dfs2(son[u],ffa);
for(int i=head[u];i;i=d[i].nxt )
{
int v=d[i].to;
if( v==fa[u]||v==son[u] ) continue;
dfs2(v,v);
}
}
void push_down(int rt,int l,int r)
{
laz[ls]+=laz[rt], laz[rs]+=laz[rt];
a[ls]+=laz[rt]*(mid-l+1), a[rs]+=laz[rt]*(r-mid);
laz[rt]=0;
}
void insert(int rt,int l,int r,int L,int R,int val)
{
if( l>=L&&r<=R ){ a[rt]+=val*(r-l+1),laz[rt]+=val; return; }
if( r<L||l>R ) return;
push_down(rt,l,r);
insert(lson,L,R,val); insert(rson,L,R,val);
a[rt] = a[ls]+a[rs];
}
int query(int rt,int l,int r,int L,int R)
{
if( l>=L&&r<=R ) return a[rt];
if( r<L||l>R ) return 0;
push_down(rt,l,r);
return query(lson,L,R)+query(rson,L,R);
}
void make(int l,int r,int val)
{
while( top[l]!=top[r] )
{
if( deep[top[l]]<deep[top[r]] ) swap(l,r);
insert(1,1,n,id[top[l]],id[l],val);
l=fa[top[l]];
}
if( deep[id[l]]>deep[id[r]] ) swap(l,r);
insert(1,1,n,id[l],id[r],val);
insert(1,1,n,id[l],id[l],-val);
}
struct ll{
int l,r;
}k[maxn]; int kn;
int main()
{
cin >> n >> m;
for(int i=1;i<n;i++)
{
int l,r; scanf("%d%d",&l,&r);
add(l,r); add(r,l);
}
dfs1(1,0); dfs2(1,1);
while( m-- )
{
char c; int l,r;
cin >> c;
if( c=='Q' )
{
cin >> l >> r;
int ans=0;
while( top[l]!=top[r] )
{
if( deep[top[l]]<deep[top[r]] ) swap(l,r);
ans+=query(1,1,n,id[top[l]],id[l]);
l=fa[top[l]];
}
if( deep[id[l]]>deep[id[r]] ) swap(l,r);
ans+=query(1,1,n,id[l],id[r]);
ans-=query(1,1,n,id[l],id[l]);
if( ans!=0 ) printf("No\n");
else printf("Yes\n");
}
else if( c=='C' )
{
cin >> l >> r;
k[++kn].l=l,k[kn].r=r;
make(l,r,1);
}
else
{
cin >> l;
r=k[l].r,l=k[l].l;
make(l,r,-1);
}
}
}