Assign the task
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3585 Accepted Submission(s): 1484
The company usually assigns some tasks to some employees to finish.When a task is assigned to someone,He/She will assigned it to all his/her subordinates.In other words,the person and all his/her subordinates received a task in the same time. Furthermore,whenever a employee received a task,he/she will stop the current task(if he/she has) and start the new one.
Write a program that will help in figuring out some employee’s current task after the company assign some tasks to some employee.
For each test case:
The first line contains an integer N (N ≤ 50,000) , which is the number of the employees.
The following N - 1 lines each contain two integers u and v, which means the employee v is the immediate boss of employee u(1<=u,v<=N).
The next line contains an integer M (M ≤ 50,000).
The following M lines each contain a message which is either
"C x" which means an inquiry for the current task of employee x
or
"T x y"which means the company assign task y to employee x.
(1<=x<=N,0<=y<=10^9)
#include <bits/stdc++.h>
using namespace std;
const int N = 50000 + 5;
int t, n, m, p = 0;
int tot;
int L[N<<2], R[N<<2];
vector<int> fa[N];
vector<int> son[N];
struct xx{
int l, r, v;
} T[N<<2];
void Pushdown(int k){
T[k<<1].v = T[k<<1|1].v = T[k].v;
T[k].v = -1;
}
void Build(int l, int r, int k){
T[k].l = l, T[k].r = r, T[k].v = -1;
if(l == r) return;
int mid = (l+r)>>1;
Build(l, mid, k<<1);
Build(mid+1, r, k<<1|1);
}
void Update(int l, int r, int k, int v){
if(l <= T[k].l && r >= T[k].r){
T[k].v = v;
return;
}
if(T[k].v != -1) Pushdown(k);
int mid = (T[k].l+T[k].r)>>1;
if(r <= mid) Update(l, r, k<<1, v);
else if(l > mid) Update(l, r, k<<1|1, v);
else{
Update(l, mid, k<<1, v);
Update(mid+1, r, k<<1|1, v);
}
}
int Query(int c, int k){
if(T[k].l == T[k].r && T[k].l == c) return T[k].v;
if(T[k].v != -1) Pushdown(k);
int mid = (T[k].l+T[k].r)>>1;
if(c <= mid) Query(c, k<<1);
else Query(c, k<<1|1);
}
void dfs(int k){
tot++;
L[k] = tot;
for(int i = 0; i < son[k].size(); i++){
dfs(son[k][i]);
}
R[k] = tot;
}
int main(){
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
fa[i].clear();
son[i].clear();
}
for(int i = 1; i < n; i++){
int u, v;
scanf("%d%d", &u, &v);
fa[u].push_back(v), son[v].push_back(u);
}
int root;
for(int i = 1; i <= n; i++){
if(!fa[i].size()){
root = i;
break;
}
}
tot = 0;
dfs(root);
tot = 0;
Build(1, n, 1);
printf("Case #%d:\n", ++p);
scanf("%d", &m);
for(int i = 0; i < m; i++){
char op[3];
scanf("%s", op);
if(op[0] == 'C'){
int x;
scanf("%d", &x);
printf("%d\n", Query(L[x], 1));
}
else{
int u, v;
scanf("%d%d", &u, &v);
Update(L[u], R[u], 1, v);
}
}
}
}