Apple Tree http://poj.org/problem?id=3321
1 #include<cstdio> 2 #include<cstring> 3 #define mt(a,b) memset(a,b,sizeof(a)) 4 #define lrrt int L,int R,int rt 5 #define iall 1,n,1 6 #define imid int mid=(L+R)>>1 7 #define lson L,mid,rt<<1 8 #define rson mid+1,R,rt<<1|1 9 using namespace std; 10 const int M=100010; 11 int tree[M<<2]; 12 void pushup(int rt){ 13 tree[rt]=tree[rt<<1]+tree[rt<<1|1]; 14 } 15 void build(lrrt){ 16 if(L==R){ 17 tree[rt]=1; 18 return ; 19 } 20 imid; 21 build(lson); 22 build(rson); 23 pushup(rt); 24 } 25 void update(int x,lrrt){ 26 if(L==R){ 27 tree[rt]^=1; 28 return ; 29 } 30 imid; 31 if(mid>=x) update(x,lson); 32 else update(x,rson); 33 pushup(rt); 34 } 35 int query(int x,int y,lrrt){ 36 if(x<=L&&R<=y) return tree[rt]; 37 imid; 38 int ans=0; 39 if(mid>=x) ans+=query(x,y,lson); 40 if(mid<y) ans+=query(x,y,rson); 41 return ans; 42 } 43 struct G{ 44 struct E{ 45 int u,v,next; 46 }e[M<<1]; 47 int le,head[M]; 48 void init(){ 49 le=0; 50 mt(head,-1); 51 } 52 void add(int u,int v){ 53 e[le].u=u; 54 e[le].v=v; 55 e[le].next=head[u]; 56 head[u]=le++; 57 } 58 }g; 59 struct Node{ 60 int l,r; 61 }node[M]; 62 int Index; 63 void dfs(int u,int fa){ 64 node[u].l=++Index; 65 for(int i=g.head[u];~i;i=g.e[i].next){ 66 int v=g.e[i].v; 67 if(v!=fa){ 68 dfs(v,u); 69 } 70 } 71 node[u].r=Index; 72 } 73 int main(){ 74 int n,m; 75 while(~scanf("%d",&n)){ 76 g.init(); 77 for(int i=0,u,v;i<n-1;i++){ 78 scanf("%d%d",&u,&v); 79 g.add(u,v); 80 g.add(v,u); 81 } 82 build(iall); 83 Index=0; 84 dfs(1,-1); 85 scanf("%d",&m); 86 while(m--){ 87 char op[4]; 88 int x; 89 scanf("%s%d",op,&x); 90 if(op[0]=='C'){ 91 update(node[x].l,iall); 92 } 93 else{ 94 printf("%d ",query(node[x].l,node[x].r,iall)); 95 } 96 } 97 } 98 return 0; 99 }
A Simple Tree Problem http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4969
1 #include<cstdio> 2 #include<vector> 3 #define lrrt int L,int R,int rt 4 #define iall 1,n,1 5 #define imid int mid=(L+R)>>1 6 #define lson L,mid,rt<<1 7 #define rson mid+1,R,rt<<1|1 8 using namespace std; 9 const int M=100010; 10 vector<int> g[M]; 11 struct N{ 12 int l,r; 13 }node[M]; 14 int Index; 15 void dfs(int u,int fa){ 16 node[u].l=++Index; 17 int len=g[u].size(); 18 for(int i=0;i<len;i++){ 19 int v=g[u][i]; 20 if(v!=fa){ 21 dfs(v,u); 22 } 23 } 24 node[u].r=Index; 25 } 26 struct T{ 27 int lazy,sum; 28 }tree[M<<2]; 29 void pushup(int rt){ 30 tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum; 31 } 32 void build(lrrt){ 33 tree[rt].sum=0; 34 tree[rt].lazy=0; 35 if(L==R) return ; 36 imid; 37 build(lson); 38 build(rson); 39 } 40 void pushdown(int mid,lrrt){ 41 if(tree[rt].lazy){ 42 tree[rt<<1].lazy^=1; 43 tree[rt<<1|1].lazy^=1; 44 tree[rt<<1].sum=(mid-L+1)-tree[rt<<1].sum; 45 tree[rt<<1|1].sum=(R-mid)-tree[rt<<1|1].sum; 46 tree[rt].lazy=0; 47 } 48 } 49 void update(int x,int y,lrrt){ 50 if(x<=L&&R<=y){ 51 tree[rt].sum=(R-L+1)-tree[rt].sum; 52 tree[rt].lazy^=1; 53 return ; 54 } 55 imid; 56 pushdown(mid,L,R,rt); 57 if(mid>=x) update(x,y,lson); 58 if(mid<y) update(x,y,rson); 59 pushup(rt); 60 } 61 int query(int x,int y,lrrt){ 62 if(x<=L&&R<=y) return tree[rt].sum; 63 imid; 64 pushdown(mid,L,R,rt); 65 int ans=0; 66 if(mid>=x) ans+=query(x,y,lson); 67 if(mid<y) ans+=query(x,y,rson); 68 return ans; 69 } 70 int main(){ 71 int n,m,x; 72 char op[4]; 73 while(~scanf("%d%d",&n,&m)){ 74 for(int i=1;i<=n;i++){ 75 g[i].clear(); 76 } 77 for(int i=2;i<=n;i++){ 78 scanf("%d",&x); 79 g[i].push_back(x); 80 g[x].push_back(i); 81 } 82 Index=0; 83 dfs(1,-1); 84 build(iall); 85 while(m--){ 86 scanf("%s%d",op,&x); 87 if(op[0]=='o'){ 88 update(node[x].l,node[x].r,iall); 89 } 90 else{ 91 printf("%d ",query(node[x].l,node[x].r,iall)); 92 } 93 } 94 puts(""); 95 } 96 return 0; 97 }
1 #include<cstdio> 2 #include<cstring> 3 #define mt(a,b) memset(a,b,sizeof(a)) 4 #define lrrt int L,int R,int rt 5 #define iall 1,n,1 6 #define imid int mid=(L+R)>>1 7 #define lson L,mid,rt<<1 8 #define rson mid+1,R,rt<<1|1 9 const int M=100010; 10 struct G{ 11 struct E{ 12 int v,next; 13 }e[M<<1]; 14 int le,head[M]; 15 void init(){ 16 le=0; 17 mt(head,-1); 18 } 19 void add(int u,int v){ 20 e[le].v=v; 21 e[le].next=head[u]; 22 head[u]=le++; 23 } 24 }g; 25 struct N{ 26 int l,r; 27 }node[M]; 28 int Index; 29 void dfs(int u,int fa){ 30 node[u].l=++Index; 31 for(int i=g.head[u];~i;i=g.e[i].next){ 32 int v=g.e[i].v; 33 if(v!=fa){ 34 dfs(v,u); 35 } 36 } 37 node[u].r=Index; 38 } 39 struct T{ 40 int lazy,sum; 41 }tree[M<<2]; 42 void pushup(int rt){ 43 tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum; 44 } 45 void build(lrrt){ 46 tree[rt].sum=0; 47 tree[rt].lazy=0; 48 if(L==R) return ; 49 imid; 50 build(lson); 51 build(rson); 52 } 53 void pushdown(int mid,lrrt){ 54 if(tree[rt].lazy){ 55 tree[rt<<1].lazy^=1; 56 tree[rt<<1|1].lazy^=1; 57 tree[rt<<1].sum=(mid-L+1)-tree[rt<<1].sum; 58 tree[rt<<1|1].sum=(R-mid)-tree[rt<<1|1].sum; 59 tree[rt].lazy=0; 60 } 61 } 62 void update(int x,int y,lrrt){ 63 if(x<=L&&R<=y){ 64 tree[rt].sum=(R-L+1)-tree[rt].sum; 65 tree[rt].lazy^=1; 66 return ; 67 } 68 imid; 69 pushdown(mid,L,R,rt); 70 if(mid>=x) update(x,y,lson); 71 if(mid<y) update(x,y,rson); 72 pushup(rt); 73 } 74 int query(int x,int y,lrrt){ 75 if(x<=L&&R<=y) return tree[rt].sum; 76 imid; 77 pushdown(mid,L,R,rt); 78 int ans=0; 79 if(mid>=x) ans+=query(x,y,lson); 80 if(mid<y) ans+=query(x,y,rson); 81 return ans; 82 } 83 int main(){ 84 int n,m,x; 85 char op[4]; 86 while(~scanf("%d%d",&n,&m)){ 87 g.init(); 88 for(int i=2;i<=n;i++){ 89 scanf("%d",&x); 90 g.add(x,i); 91 g.add(i,x); 92 } 93 Index=0; 94 dfs(1,-1); 95 build(iall); 96 while(m--){ 97 scanf("%s%d",op,&x); 98 if(op[0]=='o'){ 99 update(node[x].l,node[x].r,iall); 100 } 101 else{ 102 printf("%d ",query(node[x].l,node[x].r,iall)); 103 } 104 } 105 puts(""); 106 } 107 return 0; 108 }
end