dfs序 是很多树问题的基础
时间复杂度:
O(n)
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n, m;
vector<int> g[N];
int q[N], p[N], top;
int sz[N];
void dfs(int u)
{
sz[u] = 1;
q[top] = u, p[u] = top;
top ++ ;
for (auto v: g[u])
{
dfs(v);
sz[u] += sz[v];
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 2; i <= n; i ++ )
{
int t;
scanf("%d", &t);
g[t].push_back(i);
}
dfs(1);
while (m -- )
{
int u, k;
scanf("%d%d", &u, &k);
if (k > sz[u]) puts("-1");
else printf("%d\n", q[p[u] + k - 1]);
}
return 0;
}