除最后两个点,其他都WA
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector <int> v[N];
struct node {
int size, dep, son, fa, top, dfn;
} k[N];
int n, m, tot, w[N], pre[N];
void dfs (int x, int fa) {
k[x].dep = k[fa].dep + 1;
k[x].fa = fa; k[x].size = 1;
for (auto i : v[x]) {
if (i == fa) continue;
dfs (i, x); k[x].size += k[i].size;
if (k[i].size > k[k[x].son].size) k[x].son = i;
}
}
void dfs2 (int x, int fa, int top) {
k[x].top = top; k[x].dfn = ++tot; pre[tot] = x;
if (k[x].son) dfs2 (k[x].son, x, top);
for (auto i : v[x]) {
if (i == fa or i == k[x].son) continue;
dfs2 (i, x, i);
}
}
int t[N << 2];
void pushup (int cur) { t[cur] = max (t[cur << 1], t[cur << 1 | 1]); }
void build (int cur, int l, int r) {
if (l == r) return t[cur] = w[pre[l]], void ();
int mid = l + r >> 1;
build (cur << 1, l, mid); build (cur << 1 | 1, mid + 1, r);
pushup (cur);
}
int ask (int cur, int l, int r, int x, int y) {
if (!t[cur]) return -1;
if (l == r) return pre[l];
int mid = l + r >> 1;
if (t[cur << 1 | 1] > 0 and y > mid) return ask (cur << 1 | 1, mid + 1, r, x, y);
else if (t[cur << 1] > 0 and x <= mid) return ask (cur << 1, l, mid, x, y);
return -1;
}
void upd (int cur, int l, int r, int x) {
if (l == r) return t[cur] = 1, void ();
int mid = l + r >> 1;
if (x <= mid) upd (cur << 1, l, mid, x);
else upd (cur << 1 | 1, mid + 1, r, x);
pushup (cur);
}
int qy (int x) {
int ans = 0;
while (x != 0) {
int top = k[x].top;
ans = ask (1, 1, n, k[top].dfn, k[x].dfn);
if (ans != -1) return ans;
x = k[top].fa;
}
return 1;
}
int main () {
cin >> n >> m; w[1] = 1;
for (int i = 1; i < n; i ++) {
int x, y; cin >> x >> y;
v[x].emplace_back (y);
v[y].emplace_back (x);
}
dfs (1, 0), dfs2 (1, 0, 1);
while (m --) {
char opt; int x;
cin >> opt >> x;
if (opt == 'Q') cout << qy (x) << "\n";
else upd (1, 1, n, k[x].dfn);
}
}