不知道为什么这么裸...
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";
}
} 
京公网安备 11010502036488号