标签:线段树
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