rt,只AC了最后两个点,感觉是线段树的问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 1e5 + 1e2;
int n, Q;
struct edge
{
int to, next;
}e[MAXN];
int head[MAXN], cnt;
int fa[MAXN], d[MAXN], size[MAXN], hson[MAXN];
int TCS_cnt, dfn[MAXN], top[MAXN];
struct tree
{
int l, r, depest, tag;
}t[MAXN << 2];
inline int read()
{
int x = 0; char ch = getchar();
while ( !isdigit(ch) ) ch = getchar();
while ( isdigit(ch) ) { x = x * 10 + (ch - '0'); ch = getchar(); }
return x;
}
void add (int u, int v) { e[++ cnt].to = v; e[cnt].next = head[u]; head[u] = cnt; }
void input()
{
n = read(); Q = read();
for (register int i = 1; i < n; i ++)
{
int u, v;
u = read(); v = read();
add (u, v);
}
}
void dfs1_init() { d[1] = 1; }
void dfs1 (int u)
{
size[u] = 1;
for (register int i = head[u]; i; i = e[i].next)
{
int v = e[i].to;
fa[v] = u;
d[v] = d[u] + 1;
dfs1 (v);
size[u] += size[v];
if (!hson[u] or size[v] > size[ hson[u] ]) hson[u] = v;
}
}
void dfs2 (int u, int t)
{
dfn[u] = ++ TCS_cnt;
top[u] = t;
if (!hson[u]) return;
dfs2 (hson[u], t);
for (register int i = head[u]; i; i = e[i].next)
{
int v = e[i].to;
if (v != fa[u] and v != hson[u]) dfs2 (v, v);
}
}
void build (int p, int l, int r)
{
t[p].l = l, t[p].r = r, t[p].depest = 1;
if (l == r) return;
int mid = (l + r) >> 1;
build (p << 1, l, mid); build (p << 1 | 1, mid + 1, r);
}
void spread (int p)
{
if (!t[p].tag) return;
if (d[t[p].tag] > d[t[p << 1].depest])
{
t[p << 1].depest = t[p].tag;
if (d[t[p].tag] > d[t[p << 1].tag]) t[p << 1].tag = t[p].tag;
}
if (d[t[p].tag] > d[t[p << 1 | 1].depest])
{
t[p << 1 | 1].depest = t[p].tag;
if (d[t[p].tag] > d[t[p << 1 | 1].tag]) t[p << 1 | 1].tag = t[p].tag;
}
t[p].tag = 0;
}
void SeT_update (int p, int l, int r, int k)
{
if (l <= t[p].l and t[p].r <= r)
{
if (d[k] > d[t[p].depest])
{
t[p].depest = k;
if (d[k] > d[t[p].tag]) t[p].tag = k;
}
return;
}
spread (p);
int mid = (t[p].l + t[p].r) >> 1;
if (l <= mid) SeT_update (p << 1, l, r, k);
if (r > mid) SeT_update (p << 1 | 1, l, r, k);
if (d[t[p << 1].depest] > d[t[p << 1 | 1].depest]) t[p].depest = t[p << 1].depest;
else t[p].depest = t[p << 1 | 1].depest;
}
void TCS_update (int x)
{
SeT_update (1, dfn[x], dfn[x] + size[x] - 1, x);
}
int SeT_query (int p, int l, int r)
{
if (l <= t[p].l and t[p].r <= r) return t[p].depest;
spread (p);
int mid = (t[p].l + t[p].r) >> 1, res = -1;
if (l <= mid) res = SeT_query (p << 1, l, r);
if (r > mid)
{
int hhd = SeT_query (p << 1 | 1, l, r);
if (res = -1 or d[res] < d[hhd]) res = hhd;
}
return res;
}
int TCS_query (int u, int v)
{
int ans = -1;
while (top[u] != top[v])
{
if (d[ top[v] ] < d[ top[u] ]) swap (u, v);
ans = SeT_query (1, dfn[ top[v] ], dfn[v]);
if (ans != -1) return ans;
v = fa[ top[v] ];
}
if (d[v] < d[u]) swap (u, v);
ans = SeT_query (1, dfn[u], dfn[v]);
return ans;
}
void work()
{
while (Q --)
{
char op; int x;
cin >> op; x = read();
if (op == 'C') TCS_update (x);
else printf ("%d\n", TCS_query (1, x) );
}
}
int main()
{
input();
dfs1_init();
dfs1 (1);
dfs2 (1, 1);
build (1, 1, n);
work();
return 0;
}