1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #include<bits/extc++.h> using namespace std;
#define lch (o<<1) #define rch (o<<1|1)
typedef long long ll; const int N=100000+5,C=10+5; int n; vector<int> a[N];
struct SegTree{ int sum[N*4],lazy[N*4]; SegTree(){ memset(sum,0,sizeof(sum)); memset(lazy,-1,sizeof(lazy)); } void Pushdown(int o,int L,int R){ if(lazy[o]==-1||L==R)return; int M=(L+R)/2; sum[lch]=(M-L+1)*lazy[o]; lazy[lch]=lazy[o]; sum[rch]=(R-M)*lazy[o]; lazy[rch]=lazy[o];
lazy[o]=-1; } void Update(int qL,int qR,int f,int o=1,int L=1,int R=n){ Pushdown(o,L,R); if(qL<=L&&R<=qR){ sum[o]=(R-L+1)*f; lazy[o]=f; return; } int M=(L+R)/2; if(qL<=M)Update(qL,qR,f,lch,L,M); if(M+1<=qR)Update(qL,qR,f,rch,M+1,R); sum[o]=sum[lch]+sum[rch]; } };
struct HLDcp{ SegTree t; int dep[N],siz[N],pa[N],son[N],top[N],idx[N]; int nIdx;
void Build(){ nIdx=dep[0]=siz[0]=son[0]=0; DFS1();DFS2(); } void DFS1(int u=1,int pa=0){ dep[u]=dep[HLDcp::pa[u]=pa]+1; siz[u]=1;son[u]=0; for(int i=0;i<a[u].size();i++){ int v=a[u][i]; if(v==pa)continue; DFS1(v,u); if(siz[v]>siz[son[u]])son[u]=v; siz[u]+=siz[v]; } } void DFS2(int u=1,int pa=0){ idx[u]=++nIdx;top[u]=u; if(son[pa]==u)top[u]=top[pa]; if(son[u])DFS2(son[u],u); for(int i=0;i<a[u].size();i++){ int v=a[u][i]; if(v==pa||v==son[u])continue; DFS2(v,u); } } void Add(int u){ while(top[u]!=0){ t.Update(idx[top[u]],idx[u],1); u=pa[top[u]]; } } void Delete(int u){ t.Update(idx[u],idx[u]+siz[u]-1,0); } int Query(){ return t.sum[1]; } };
HLDcp t;
int Abs(int x){ return x>0?x:-x; }
int main(){ scanf("%d",&n); for(int u=2,v;u<=n;u++){ scanf("%d",&v); a[u].push_back(v+1); a[v+1].push_back(u); }
t.Build();
int pre=0; int q; scanf("%d",&q); while(q--){ int op,id; scanf("%d%d",&op,&id); if(op==1)t.Add(id+1); else t.Delete(id+1); int now=t.Query(); printf("%d\n",Abs(now-pre)); pre=now; }
return 0; }
|