在进行C操作的时候会卡住,求助。
/*
* @Author: Aisaka_Taiga
* @Date: 2023-08-28 08:56:05
* @LastEditTime: 2023-08-28 09:46:47
* @LastEditors: Aisaka_Taiga
* @FilePath: \Desktop\P3950.cpp
* 心比天高,命比纸薄。
*/
#include <bits/stdc++.h>
// #define int long long
#define rs (x << 1 | 1)
#define ls (x << 1)
#define N 300100
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){f=ch!='-';ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return f?x:-x;}
struct node1{int v, next;} e[N << 1];
struct node2{int len, tag, sum;} t[N << 2];
int n, m, dfn[N], pre[N], siz[N], f[N], top[N], dep[N], son[N], cnt, tim, head[N];
int U[N], V[N], tot;
inline void add(int u, int v){e[++ cnt] = (node1){v, head[u]}; head[u] = cnt;}
inline void p_p(int x){t[x].sum = t[ls].sum + t[rs].sum;}
void dfs1(int x, int fa)
{
f[x] = fa;
siz[x] = 1;
dep[x] = dep[fa] + 1;
for(int i = head[i]; i; i = e[i].next)
{
int v = e[i].v;
if(v == fa) continue;
dfs1(v, x);
if(siz[v] > siz[son[x]]) son[x] = v;
siz[x] += siz[v];
}
return ;
}
void dfs2(int x, int tp)
{
top[x] = tp;
dfn[x] = ++ tim;
pre[tim] = x;
if(!son[x]) return ;
dfs2(son[x], tp);
for(int i = head[x]; i; i = e[i].next)
{
int v = e[i].v;
if(v == f[x] || v == son[x]) continue;
dfs2(v, v);
}
return ;
}
inline void build(int x, int l, int r)
{
t[x].len = r - l + 1;
if(l == r) return ;
int mid = l + r >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
return ;
}
inline void p_d(int x)
{
if(t[x].tag == 0) return ;
t[ls].tag += t[x].tag;
t[rs].tag += t[x].tag;
t[ls].sum += t[ls].len * t[x].tag;
t[rs].sum += t[rs].len * t[x].tag;
t[x].tag = 0;
return ;
}
inline void add(int x, int l, int r, int nl, int nr, int v)
{
if(nl <= l && r <= nr)
{
t[x].sum += t[x].len * v;
t[x].tag += v;
return ;
}
p_d(x);
int mid = l + r >> 1;
if(mid >= nl) add(ls, l, mid, nl, nr, v);
if(mid < nr) add(rs, mid + 1, r, nl, nr, v);
p_p(x);
return ;
}
inline void Add(int x, int y, int v)
{
int top1 = top[x], top2 = top[y];
while(top1 != top2)
{
if(dep[top1]<dep[top2]) swap(top1, top2), swap(x, y);
add(1, 1, n, dfn[top1], dfn[x], v);
x = f[top1], top1 = top[x];
}
if(dep[x] > dep[y]) swap(x, y);
add(1, 1, n, dfn[x] + 1, dfn[y], v);
return ;
}
inline int ask(int x, int l, int r, int nl, int nr)
{
int res = 0;
if(nl <= l && r <= nr) return t[x].sum;
int mid = l + r >> 1;
p_d(x);
if(nl <= mid) res += ask(ls, l, mid, nl, nr);
if(nr > mid) res += ask(rs, mid + 1, r, nl, nr);
return res;
}
inline int Ask(int x, int y)
{
int top1 = top[x], top2 = top[y], res = 0;
while(top1 != top2)
{
if(dep[top1] < dep[top2]) swap(top1, top2), swap(x, y);
res += ask(1, 1, n, dfn[top1], dfn[x]);
x = f[top1], top1 = top[x];
}
if(dep[x] < dep[y]) swap(x, y);
res += ask(1, 1, n, dfn[y] + 1, dfn[x]);
return res;
}
signed main()
{
n = read(), m = read();
for(int i = 1; i <= n - 1; i ++)
{
int u = read(), v = read();
add(u, v);
add(v, u);
}
dfs1(1, 0);
dfs2(1, 1);
build(1, 1, n);
for(int i = 1; i <= m; i ++)
{
int x, y;
char op;
cin >> op;
// cout << "CAO" << endl;
if(op == 'C') tot ++, U[tot] = read(), V[tot] = read(), Add(U[tot], V[tot], 1);
if(op == 'Q') x = read(), y = read(), cout << (Ask(x, y) >= 1 ? "No" : "Yes") << endl;
if(op == 'U') x = read(), Add(U[x], V[x], -1);
}
return 0;
}