#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <bitset>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef unsigned long long ull;
#define freedom() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
inline int read(){int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
const int maxn = 1e5+5;
int n,m,sum,fa[maxn];
struct Node{
int l,r,val;
int mid(){
return (l+r)>>1;
}
}node[maxn<<2];
struct Edge{
int to,next;
}edge[maxn];
int head[maxn],tot;
int In[maxn],Out[maxn],deg[maxn],id;
void add_edge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void dfs(int x,int f)
{
In[x]=++id;
deg[x]=id;
for(int i=head[x];i!=-1;i=edge[i].next)
{
int y=edge[i].to;
if(y==f) continue;
dfs(y,x);
}
Out[x]=id;
}
//void BuildTree(int rt,int l,int r)
//{
// node[rt].l=l,node[rt].r=r,node[rt].val=1;
// if(l==r){
// fa[l]=rt;
// return;
// }
// int mid=node[rt].mid();
// BuildTree(lson);
// BuildTree(rson);
//}
//
//void UpdateTree(int rt)
//{
// if(rt==1) return;
// int fi=rt>>1;
// node[fi].val=node[fi<<1].val+node[fi<<1|1].val;
// UpdateTree(rt>>1);
//}
//
//void Query(int rt,int l,int r)
//{
// if(node[rt].l==l&&node[rt].r==r){
// sum+=node[rt].val;
// return;
// }
// int mid=node[rt].mid();
// if(mid>=r) Query(rt<<1,l,r);
// else if(l>mid) Query(rt<<1|1,l,r);
// else Query(lson),Query(rson);
//}
void Pushup(int rt)
{
node[rt].val=node[rt<<1].val+node[rt<<1|1].val;
}
void BuildTree(int rt,int l,int r)
{
node[rt].l=l,node[rt].r=r,node[rt].val=1;
if(l==r){
fa[l]=rt;
return;
}
int mid=node[rt].mid();
BuildTree(lson);
BuildTree(rson);
Pushup(rt);
}
void UpdateTree(int rt,int x)
{
if(node[rt].l==node[rt].r)
{
if(node[rt].val) node[rt].val=0;
else node[rt].val=1;
return;
}
int mid=node[rt].mid();
if(mid>=x) UpdateTree(rt<<1,x);
else UpdateTree(rt<<1|1,x);
Pushup(rt);
}
int QueryTree(int rt,int l,int r)
{
if(node[rt].l==l&&node[rt].r==r)
return node[rt].val;
int mid=(node[rt].l+node[rt].r)>>1;
int ans=0;
if(mid>=r) ans+=QueryTree(rt<<1,l,r);
else if(l>mid) ans+=QueryTree(rt<<1|1,l,r);
else ans+=QueryTree(rt<<1,l,mid),ans+=QueryTree(rt<<1|1,mid+1,r);
return ans;
}
int pre[maxn];
int main()
{
n=read();
for(int i=1;i<=n;i++)
pre[i]=i,head[i]=-1;
BuildTree(1,1,n);
for(int i=1;i<n;i++)
{
int u=read(),v=read();
pre[v]=u;
add_edge(u,v);
}
for(int i=1;i<=n;i++)
if(pre[i]==i) dfs(i,-1);
m=read();
while (m--)
{
char op; cin>>op;
if(op=='C')
{
int x=read();
UpdateTree(1,deg[x]);
}
else
{
int x=read();
printf("%d\n",QueryTree(1,In[x],Out[x]));
}
}
return 0;
}
树 状 数 组 维 护 D F S 序 树状数组维护DFS序 树状数组维护DFS序
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <bitset>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define lowbit(x) ((x)&-(x))
typedef unsigned long long ull;
#define freedom() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
inline int read(){int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
const int maxn = 1e5+5;
int n,m,tree[maxn<<2];
struct Edge{
int to,next;
}edge[maxn<<2];
int head[maxn],tot;
int In[maxn],Out[maxn],deg[maxn],id;
void add_edge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void dfs(int x,int f)
{
In[x]=++id;
deg[x]=id;
for(int i=head[x];i!=-1;i=edge[i].next)
{
int y=edge[i].to;
if(y==f) continue;
dfs(y,x);
}
Out[x]=id;
}
void Update(int x,int k)
{
while (x<=n)
tree[x]+=k,x+=lowbit(x);
}
int Query(int x)
{
int ans=0;
while (x)
ans+=tree[x],x-=lowbit(x);
return ans;
}
int pre[maxn];
int a[maxn];
int main()
{
n=read();
memset(head,-1,sizeof(head));
for(int i=1;i<=n;i++)
Update(i,1),pre[i]=i,a[i]=1;
for(int i=1;i<n;i++)
{
int u=read(),v=read();
add_edge(u,v);
// add_edge(v,u);
pre[v]=u;
}
for(int i=1;i<=n;i++)
if(pre[i]==i)
dfs(i,-1);
m=read();
while (m--)
{
char op; cin>>op;
int x=read();
if(op=='Q')
{
printf("%d\n",Query(Out[x])-Query(In[x]-1));
}
else
{
if(a[x])
a[x]=0,Update(deg[x],-1);
else a[x]=1,Update(deg[x],1);
}
}
return 0;
}
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <bitset>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef unsigned long long ull;
#define freedom() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
inline int read(){int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
const int maxn = 1e6+5;
struct Node{
int l,r,val;
int mid(){
return (l+r)>>1;
}
}node[maxn<<2];
struct Edge{
int to,next;
}edge[maxn];
int head[maxn],tot;
int In[maxn],nums[maxn],Out[maxn],id,pre[maxn];
void add_edge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void Pushdown(int rt)
{
if(node[rt].val!=-1) {
node[rt<<1].val=node[rt].val;
node[rt<<1|1].val=node[rt].val;
node[rt].val=-1;
}
}
void BulidTree(int rt,int l,int r)
{
node[rt].l=l,node[rt].r=r,node[rt].val=-1;
if(l==r) return;
int mid=node[rt].mid();
BulidTree(rt<<1,l,mid);
BulidTree(rt<<1|1,mid+1,r);
}
void UpdateTree(int rt,int l,int r,int col)
{
if(l<=node[rt].l&&r>=node[rt].r){
node[rt].val=col;
return;
}
int mid=node[rt].mid();
Pushdown(rt);
if(r<=mid) UpdateTree(rt<<1,l,r,col);
else if(l>mid) UpdateTree(rt<<1|1,l,r,col);
else UpdateTree(rt<<1,l,mid,col),UpdateTree(rt<<1|1,mid+1,r,col);
}
int QueryTree(int pos,int rt)
{
if(node[rt].l==node[rt].r) return node[rt].val;
int mid=node[rt].mid();
Pushdown(rt);
if(pos<=mid) return QueryTree(pos,rt<<1);
else return QueryTree(pos,rt<<1|1);
}
void dfs(int x,int fa)
{
In[x]=++id;
nums[x]=id;
for(int i=head[x];i!=-1;i=edge[i].next)
{
int y=edge[i].to;
if(y==fa) continue;
dfs(y,x);
}
Out[x]=id;
}
void init(int n)
{
tot=0, id=0;
for(int i=0;i<=n;i++)
In[i]=0,Out[i]=0,head[i]=-1,pre[i]=i;
}
int main()
{
int t=read(),cas=0;
while (t--)
{
int n=read();
init(n);
BulidTree(1,1,n);
for(int i=1;i<n;i++)
{
int u=read(),v=read();
pre[u]=v;
add_edge(u,v);
add_edge(v,u);
}
for(int i=1;i<=n;i++)
if(pre[i]==i) { dfs(i,-1);break; }
int m=read();
printf("Case #%d:\n",++cas);
while (m--)
{
char op; cin>>op;
if(op=='C')
{
int x=read();
printf("%d\n",QueryTree(nums[x],1));
}
else
{
int x=read(),col=read();
UpdateTree(1,In[x],Out[x],col);
}
}
}
return 0;
}