不知道为什么这么裸...

vec存图排个序

然后按照dfs的顺序给节点小到大编号

顺被维护一个表示节点编号是的是哪个节点...

#include <bits/stdc++.h>
using namespace std;
const int maxn = 8e5+10;
struct edge{
    int to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){
    d[++cnt] = (edge){v,head[u]},head[u]=cnt;
}
int id[maxn],num,n,q,siz[maxn],idf[maxn];
vector<int>vec[maxn];
void dfs(int u,int fa)
{
    id[u] = ++num; siz[u] = 1, idf[num] = u;
    for(int i=0;i<vec[u].size();i++ )
    {
        int v=vec[u][i];
        if( v==fa )    continue;
        dfs(v,u);
        siz[u] += siz[v];
    }
}
int main()
{
    cin >> n >> q;
    for(int i=2;i<=n;i++)
    {
        int x; cin >> x;
        vec[x].push_back(i);
    }
    for(int i=1;i<=n;i++)    
        sort( vec[i].begin(),vec[i].end() );
    dfs(1,0);
    while( q-- )
    {
        int u,k;
        scanf("%d%d",&u,&k);
        if( siz[u]<k  )    cout << -1 << "\n";
        else     cout << idf[ id[u]+k-1 ] << "\n";
    }
}