据定义
节点 u 的 1-father 为 路径 (1, u) 上距 u 最近的节点
所以节点 1 的 节点 1 的 1-father 为 路径 (1, 1) 上距 1 最近的节点,那么就是 1。
如果按照 "节点 1 的 1-father 仍为 1" 也能做,但数据并不是这样子的?
对于这组数据输出应该为 1
4 1
1 1 3
2 2
也就是遇到查询 depu<k 的查询直接答案算为 0 了,是题意有误还是大家都写错了。
还有能不能帮我调下代码啊qwq,最后一个点WA了。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2.3e6+10;
const int N=1000010;
int n,m;
int head[N],st[N],dep[N];
int tot,sum[MAXN],rt[N];
int node,rub[MAXN],ttop;
int ls[MAXN],rs[MAXN];
int ans[N],Maxdep,tops;
struct E {
int nxt,to;
} e[N];
inline void add(int x,int y) {
e[++tot]=(E) {head[x],y};
head[x]=tot;
}
struct List{
int nxt;
pair<int,int>v;
}vt[N<<1];
int Head[N<<1],cnt;
void add_query(int pos,pair<int,int> v){
vt[++cnt]=(List){Head[pos],v};
Head[pos]=cnt;
}
inline int Max(int x,int y){return x>y?x:y;}
struct Q {
int v,p;
} q[N];
inline int bd() {
if(ttop)return rub[ttop--];
return ++node;
}
inline void del(int x) {
rub[++ttop]=x;
sum[x]=0;ls[x]=rs[x]=0;
}
inline void pushup(int x) {sum[x]=sum[ls[x]]+sum[rs[x]];}
void change(int &x,int L,int R,int pos,int v) {
if(!x)x=bd();
if(L==R) {
sum[x]+=v;
return;
}
int mid=(L+R)>>1;
if(pos<=mid)change(ls[x],L,mid,pos,v);
else change(rs[x],mid+1,R,pos,v);
pushup(x);
}
int query(int x,int L,int R,int pos) {
if(L==R)return sum[x];
int mid=(L+R)>>1;
if(pos<=mid)return query(ls[x],L,mid,pos);
return query(rs[x],mid+1,R,pos);
}
int merge(int x,int y,int l,int r) {
if(!x||!y)return x+y;
if(l==r) {
sum[x]+=sum[y];
del(y);
return x;
}
int mid=(l+r)>>1;
ls[x]=merge(ls[x],ls[y],l,mid);
rs[x]=merge(rs[x],rs[y],mid+1,r);
del(y);
pushup(x);
return x;
}
void dfs_merge(int x) {
st[++tops]=x;
change(rt[x],1,Maxdep,dep[x],1);
for(int i=Head[x];i;i=vt[i].nxt){
pair<int,int>j=vt[i].v;
add_query(st[tops-j.first]+n,j);
}
for(int i=head[x]; i; i=e[i].nxt) {
int j=e[i].to;
dfs_merge(j);
rt[x]=merge(rt[x],rt[j],1,Maxdep);
}
for(int i=Head[x+n];i;i=vt[i].nxt){
pair<int,int>j=vt[i].v;
ans[j.second]=query(rt[x],1,Maxdep,dep[x]+j.first);
}
tops--;
}
void dfs(int x){
for(int i=head[x];i;i=e[i].nxt){
int j=e[i].to;
dep[j]=dep[x]+1;
Maxdep=Max(Maxdep,dep[j]);
dfs(j);
}
}
int main() {
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);dep[1]=1;
for(int i=1,x; i<n; ++i) {
scanf("%d",&x);
add(x,i+1);
}
dfs(1);
for(int i=1; i<=m; ++i) {
scanf("%d%d",&q[i].v,&q[i].p);
if(dep[q[i].v]>q[i].p)
add_query(q[i].v,make_pair(q[i].p,i));
}
dfs_merge(1);
for(int i=1; i<=m; ++i){
int A=Max(ans[i]-1,0);
printf("%d ", A);
}
return 0;
}