1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; vector<int> G[N]; struct tnode { int fa, dep, son, tot, z, tp; } t[N]; void dfs1(int x, int xfa) { t[x] = tnode{xfa, t[xfa].dep + 1, 0, 1, x, x}; for (int y : G[x]) if (y != xfa) { dfs1(y, x); t[x].tot += t[y].tot; if (t[t[x].son].tot < t[y].tot) t[x].son = y; } } int z, ys[N]; void dfs2(int x, int tp) { ++z; t[x].z = z; t[x].tp = tp; ys[z] = x; if (t[x].son != 0) dfs2(t[x].son, tp); for (int y : G[x]) if (y != t[x].fa && y != t[x].son) dfs2(y, y); } struct trnode { int l, r, lc, rc, c; } tr[2 * N]; int trlen; void bt(int l, int r) { trlen++; int now = trlen; tr[now] = trnode{l, r, -1, -1, 999999}; if (l == r) tr[now].c = 999999; else { int mid = (l + r) / 2; tr[now].lc = trlen + 1; bt(l, mid); tr[now].rc = trlen + 1; bt(mid + 1, r); tr[now].c = min(tr[tr[now].lc].c, tr[tr[now].rc].c); } } void change(int now, int x) { if (tr[now].l == tr[now].r) { tr[now].c = (tr[now].c == 999999) ? x : 999999; return; } int mid = (tr[now].l + tr[now].r) / 2, lc = tr[now].lc, rc = tr[now].rc; if (x <= mid) change(lc, x); else change(rc, x); tr[now].c = min(tr[lc].c, tr[rc].c); } int findmin(int now, int l, int r) { if (tr[now].l == l && tr[now].r == r) return tr[now].c; int mid = (tr[now].l + tr[now].r) / 2, lc = tr[now].lc, rc = tr[now].rc; if (r <= mid) return findmin(lc, l, r); else if (l >= mid + 1) return findmin(rc, l, r); else return min(findmin(lc, l, mid), findmin(rc, mid + 1, r)); } int solve(int x) { int p = 999999; while (x != 0) { p = min(p, findmin(1, t[t[x].tp].z, t[x].z)); x = t[t[x].tp].fa; } return (p == 999999) ? -1 : ys[p]; } int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1, x, y; i < n; i++) { scanf("%d%d", &x, &y); G[x].push_back(y); G[y].push_back(x); } t[0] = tnode{0, 0, 0, 0, 0, 0}; dfs1(1, 0); z = 0; dfs2(1, 1); trlen = 0; bt(1, z); for (int i = 1, p, x; i <= m; i++) { scanf("%d%d", &p, &x); if (p == 0) change(1, t[x].z); else printf("%d\n", solve(x)); } return 0; }
- 1
信息
- ID
- 547
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 57
- 已通过
- 22
- 上传者