时间戳类型线段树。。。通过一个dfs给树中各节点重新分配一个遍历的序号。。
第一次写 感觉还是很不错的
#include<stdio.h>
#include<string.h>
#include<vector>
#define M 50005
using namespace std;
struct node
{
int l,r;
int now,cover;
}tree[M*8];
vector<int> edge[M];
int n,m,time;
bool v[M];
int start[M],end[M];
void dfs(int x)
{
int i;
start[x]=time++;
for(i=0;i<edge[x].size();i++)
dfs(edge[x][i]);
end[x]=time;
}
void build(int l,int r,int id)
{
tree[id].l=l; tree[id].r=r;
tree[id].now=-1;//printf("id=%d: %d %d\n",id,tree[id].l,tree[id].r);
tree[id].cover=0;
if(l+1>=r) return ;
int mid=(l+r)>>1;
build(l,mid,id*2);
build(mid,r,id*2+1);
}
void update(int l,int r,int k,int id)
{
//printf("l=%d r=%d k=%d tr_l=%d tr_r=%d tr_c=%d\n",l,r,k,tree[id].l,tree[id].r,tree[id].cover);
if(tree[id].l==l&&tree[id].r==r)
{
tree[id].now=k;
tree[id].cover=1;
return;
}
if(tree[id].cover)
{
tree[id].cover=0;
tree[id*2].now=tree[id*2+1].now=tree[id].now;
tree[id*2].cover=tree[id*2+1].cover=1;
}
int mid=(tree[id].l+tree[id].r)>>1;
if(mid>=r)
update(l,r,k,id*2);
else if(mid<=l)
update(l,r,k,id*2+1);
else
{
update(l,mid,k,id*2);
update(mid,r,k,id*2+1);
}
}
int search(int l,int r,int id)
{
//printf("-----id=%d l=%d r=%d tr_l=%d tr_r=%d tr_c=%d\n",id,l,r,tree[id].l,tree[id].r,tree[id].cover);
if(tree[id].cover)
return tree[id].now;
if(tree[id].l==l&&tree[id].r==r)
return tree[id].now;
int mid=(tree[id].l+tree[id].r)>>1;
if(r<=mid)
return search(l,r,id*2);
else if(l>=mid)
return search(l,r,id*2+1);
else return search(l,mid,id*2);
}
int main()
{
int t,cas=1;
int i,a,b;
char ss[10];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
edge[i].clear();
v[i]=false;
}
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
edge[b].push_back(a);
v[a]=true;
}
time=1;
for(i=1;i<=n;i++)
if(!v[i]) break;
dfs(i);
//printf("--------%d\n",time);
//for(i=1;i<=n;i++)
// printf("%d %d %d\n",i,start[i],end[i]);
build(1,time,1);
scanf("%d",&m);
printf("Case #%d:\n",cas++);
while(m--)
{
scanf("%s",ss);
if(ss[0]=='T')
{
scanf("%d%d",&a,&b);
update(start[a],end[a],b,1);
}
else if(ss[0]=='C')
{
scanf("%d",&a);
printf("%d\n",search(start[a],end[a],1));
}
}
}
return 0;
}