线段树,区间更新,单点询问。
一个序列。
更新:T a b , 将a所对应的区间的值都改成b
询问:C a,问a的值是多少?
做题过程:
哎,又开始漫漫找错路。。。
原来这题是要自己找根的。原来写的lazy操作是对的,wa了之后我就将lazy那个数组直接删了,当时我想val它自己就相当于一个lazy操作,结果样例肿么都过不了。不得已,手写样例。发觉是需要lazy这个数组的,它来记录val[rt]这个值是否覆盖整个区间。
/*
Pro: 0
Sol:
date:
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define havem int m = (l + r ) >> 1
#define maxn 50010
using namespace std;
int t, n, Q, head[maxn],L[maxn], R[maxn],li,sub,is[maxn];
int val[maxn << 2], lazy[maxn << 2];
char op[10];
void init(){
memset(L,0,sizeof(L));
memset(head, -1, sizeof(head));
memset(is,0,sizeof(is));
sub = li = 0;
}
void build(int l, int r, int rt){
lazy[rt] = 0; val[rt] = -1;
if(l == r) return ;
havem;
build(lson); build(rson);
}
struct Edge{
int v,nxt;
}edge[maxn << 1];//
void add(int u, int v){
edge[sub].v = v;
edge[sub].nxt = head[u];
head[u] = sub ++;
}
void dfs(int rt){
L[rt] = ++li;//从1开始建
for(int j = head[rt]; j != -1; j = edge[j].nxt){
if(!L[edge[j].v]) dfs(edge[j].v);
}
R[rt] = li;
}
void push_dn(int rt){
if(lazy[rt]){
val[rt << 1] = val[rt << 1 | 1] = lazy[rt];
lazy[rt << 1] = lazy[rt << 1 | 1] = lazy[rt];
lazy[rt] = 0;
}
}
void update(int& L,int & R, int& cc, int l, int r, int rt){
if(L <= l && r <= R){
lazy[rt] = cc; val[rt] = cc; return ;
}push_dn(rt);
havem;
if(L <= m) update(L,R,cc,lson);
if(R > m) update(L,R,cc,rson);
}
int query(int& pos , int l, int r, int rt){
if(l == r) return val[rt];
push_dn(rt); havem;
if(pos <= m) return query(pos,lson);
else return query(pos,rson);
}
int main(){
scanf("%d",&t); int a, b;
for(int ca = 1; ca <= t; ca ++){
printf("Case #%d:\n",ca);
init();
scanf("%d",&n);
for(int i = 0; i < n - 1; i ++){
scanf("%d%d",&a,&b);
// add(a,b);
add(b, a);
is[a] ++;
}
for(int i = 1; i <= n; i ++)
if(!is[i]) {dfs(i); break;}
// for(int i = 1; i <= n; i ++)
// cout << i << " ** " << R[i] << endl;
build(1,n,1);
scanf("%d",&Q);
for(int i =0 ; i < Q; i ++){
scanf("%s",op);
if(op[0] == 'C'){
scanf("%d",&a);
printf("%d\n",query(L[a],1,n,1));
}else{
scanf("%d%d",&a,&b);
update(L[a],R[a],b,1,n,1);
}
}
}
return 0;
}