一定要移一位啊!!!!!不然son[0] = 0无法记录重儿子啊!
install:就是这个点到根节点的路径上所有没有下载的点的和
uninstall:就是这个点的子树中所有下载的点的和;
install :查询完后,在dfs序上修改,使这条路所有点权为1;(线段树实现)
uninstall:这个点的子树中所有点修改为0 ;dfs序上区间修改
#include<iostream>
#include<cstdio>
#pragma GCC optimize(2)
#define RG register
using namespace std;
int n, m, flag[800005], tag[800005], dep[100005], top[100005], siz[100005], fa[100005], son[100005], in[100005], out[100005], idc, sum[800005];
char s[100];
int tp, tov[100005], nex[100005], h[100005];
void add(int x,int y)
{
tp++;
tov[tp] = y;
nex[tp] = h[x];
h[x] = tp;
}
void dfs(int x,int f)
{
siz[x] = 1;
fa[x] = f;
for(RG int i = h[x]; i; i = nex[i])
{
int v = tov[i];
if(v == f) continue;
dep[v] = dep[x] + 1;
dfs(v,x);
siz[x] += siz[v];
if(siz[v] > siz[son[x]]) son[x] = v;
}
}
void dfs1(int x,int f)
{
in[x] = ++idc;
top[x] = f;
if(son[x] > 0) dfs1(son[x],f);
for(RG int i = h[x]; i; i = nex[i])
{
int v = tov[i];
if(v == fa[x] || v == son[x])
{
continue;
}
dfs1(v,v);
}
out[x] = idc;
}
void update(int o)
{
sum[o] = sum[o << 1] + sum[o << 1 | 1];
}
void pushdown(int o, int l, int r)
{
if(flag[o] == 1)
{
int mid = (l + r) >> 1;
flag[o << 1] = flag[o << 1 | 1] = 1;
flag[o] = 0;
sum[o << 1] = 1ll*(mid - l + 1) * tag[o];
sum[o << 1 | 1] = 1ll*(r - mid) * tag[o];
tag[o << 1] = tag[o << 1 | 1] = tag[o];
tag[o] = 0;
}
}
inline int qurey(int o,int l,int r,int ql,int qr)
{
pushdown(o, l, r);
if(ql <= l && r <= qr)
{
return sum[o];
}
int mid = (l + r) >> 1;
int rt = 0;
if(ql <= mid) rt += qurey(o << 1,l,mid,ql,qr);
if(mid < qr) rt += qurey(o << 1 | 1,mid+1,r,ql,qr);
return rt;
}
void modify(int o, int l, int r, int ql, int qr, int val)
{
pushdown(o, l, r);
if(ql <= l && r <= qr)
{
sum[o] = (r - l + 1) *val;
tag[o] = val;
flag[o] = 1;
return;
}
int mid = (l + r) / 2;
if(ql <= mid) modify(o << 1, l, mid, ql, qr, val);
if(mid < qr) modify(o << 1 | 1, mid + 1, r, ql, qr, val);
update(o);
}
int get(int u,int x)
{
int rt = 0;
while(top[u] != top[x])
{
if(dep[top[u]] < dep[top[x]]) swap(x,u);
rt += qurey(1,1,idc,in[top[u]],in[u]);
modify(1, 1, idc, in[top[u]], in[u],1);
u = fa[top[u]];
}
if(dep[x] < dep[u]) swap(x,u);
rt += qurey(1, 1, idc, in[u], in[x]);
modify(1, 1, idc, in[u], in[x],1);
return rt;
}
int main()
{
scanf("%d",&n);;
for(RG int i = 2; i <= n ; i++)
{
int x;
scanf("%d",&x);
x += 1;
add(x,i);
}
dep[1] = 1;
dfs(1,1);
dfs1(1,0);
scanf("%d",&m);
for(RG int i = 1; i <= m; i++)
{
int a;
scanf("%s",s);
scanf("%d",&a);
a++;
if(s[0] == 'u')
{
printf("%d\n",qurey(1, 1, idc, in[a], out[a]));
modify(1, 1, idc, in[a], out[a], 0);
}
else
{
int ha = get(1,a);
printf("%d\n",dep[a] - ha) ;
}
}
return 0;
}