标签:线段树
1 5 4 3 3 2 1 3 5 2 5 C 3 T 2 1 C 3 T 3 2 C 3
Case #1: -1 1 2
/************************************************************************* > File Name: hdu3974.cpp > Author: ALex > Mail: 405045132@qq.com > Created Time: 2015年01月11日 星期日 20时50分13秒 ************************************************************************/ #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 50110; struct node { int l, r; int add; int job; }tree[N << 2]; vector <int> edge[N]; int s[N], e[N], cnt; int deg[N]; void dfs (int u) { int m = edge[u].size(); s[u] = ++cnt; for (int i = 0; i < m; ++i) { int v = edge[u][i]; dfs (v); } e[u] = cnt; } void pushdown (int p) { if (tree[p].add != -1) { tree[p << 1].add = tree[p << 1 | 1].add = tree[p].add; tree[p << 1].job = tree[p << 1 | 1].job = tree[p].add; tree[p].add = -1; } } void build (int p, int l, int r) { tree[p].l = l; tree[p].r = r; tree[p].add = -1; tree[p].job = -1; if (l == r) { return; } int mid = (l + r) >> 1; build (p << 1, l, mid); build (p << 1 | 1, mid + 1, r); } void update (int p, int l, int r, int val) { if (l == tree[p].l && r == tree[p].r) { tree[p].job = val; tree[p].add = val; return; } pushdown (p); int mid = (tree[p].l + tree[p].r) >> 1; if (r <= mid) { update (p << 1, l, r, val); } else if (l > mid) { update (p << 1 | 1, l, r, val); } else { update (p << 1, l, mid, val); update (p << 1 | 1, mid + 1, r, val); } } int query (int p, int pos) { if (tree[p].l == tree[p].r) { return tree[p].job; } pushdown (p); int mid = (tree[p].l + tree[p].r) >> 1; if (pos <= mid) { return query (p << 1, pos); } else { return query (p << 1 | 1, pos); } } int main() { int t, n, m; int icase = 1; char op[10]; int x, y; scanf("%d", &t); while (t--) { scanf("%d", &n); memset (deg, 0, sizeof(deg)); for (int i = 0; i <= n; ++i) { edge[i].clear(); } int u, v; for (int i = 1; i <= n - 1; ++i) { scanf("%d%d", &u, &v); edge[v].push_back(u); deg[u]++; } int root; for (int i = 1; i <= n; ++i) { if (!deg[i]) { root = i; break; } } cnt = 0; dfs (root); build (1, 1, cnt); scanf("%d", &m); printf("Case #%d:\n", icase++); while (m--) { scanf("%s", op); if (op[0] == 'C') { scanf("%d", &x); printf("%d\n", query(1, s[x])); } else { scanf("%d%d", &x, &y); int l = s[x]; int r = e[x]; update (1, l, r, y); } } } return 0; }
标签:线段树
原文地址:http://blog.csdn.net/guard_mine/article/details/42616145