这题没啥可说的,就是线段树题,

#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 100;
#define lson node*2
#define rson node*2 + 1
int id[maxn], f[maxn], dep[maxn];
int top[maxn], son[maxn], siz[maxn];
int head[maxn];
struct Node {
int to;
int next;
}G[maxn * 2];
int z = 0;
void add(int be, int en) {
G[++z].to = en;
G[z].next = head[be];
head[be] = z;
}
ll tree[maxn * 4];
int push(int node, int be, int en) {
int mid = be + en >> 1;
if (tree[node]) {
if (!tree[lson]) tree[lson] = tree[node];
else {
if (dep[tree[lson]] < dep[tree[node]]) {//
tree[lson] = tree[node];
}
}
if (!tree[rson]) tree[rson] = tree[node];
else {
if (dep[tree[rson]] < dep[tree[node]]) {//
tree[rson] = tree[node];
}
}
tree[node] = 0;
}
return 0;
}
int update(int node, int be, int en, int LL, int RR, int val) {
int mid = be + en >> 1;
if (LL <= be && en <= RR) {
if (tree[node] == 0 || dep[tree[node]] < dep[val]) {
tree[node] = val;
}
return 0;
}
push(node, be, en);
if (LL <= mid) update(lson, be, mid, LL, RR, val);
if (RR > mid) update(rson, mid + 1, en, LL, RR, val);
}
int cn = 0;
int ask(int node, int be, int en, int i) {
int mid = be + en >> 1;
if (be == en) {
printf("%lld
", tree[node]);
return 0;
}
push(node, be, en);
if (i <= mid) ask(lson, be, mid, i);
else ask(rson, mid + 1, en, i);
}
int dfs(int x, int fa, int d) {
f[x] = fa;
siz[x] = 1;
int s = 0;
dep[x] = d;
for (int i = head[x]; i; i = G[i].next) {
int p = G[i].to;
if (p == fa) continue;
dfs(p, x, d + 1);
siz[x] += siz[p];
if (s > siz[p]) {
son[x] = p;
s = siz[p];
}
}
return 0;
}
int cnn = 0;
int dfs2(int x, int tp) {
id[x] = ++cn;
top[x] = tp;
if (son[x]) dfs2(son[x], tp);
for (int i = head[x]; i; i = G[i].next) {
int p = G[i].to;
if (p == f[x] || p == son[x]) continue;
dfs2(p, p);
}
return 0;
}
int main() {
int n;
int m;
scanf("%d %d", &n, &m);
int be, en;
for (int i = 1; i < n; i++) {
scanf("%d%d", &be, &en);
add(be, en);
add(en, be);
}
dfs(1, -1, 1);
dfs2(1, 1);
dep[0] = 0;
update(1, 1, n, id[1], id[1] + siz[1] - 1, 1);
while (m--) {
int x;
char op[20];
scanf("%s", op);
scanf("%d", &x);
if (op[0] == 'Q') {//询问
ask(1, 1, n, id[x]);
}
else {//标记
update(1, 1, n, id[x], id[x] + siz[x] - 1, x);
}
}
return 0;
}