cf 1006E

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <algorithm>
 6 #include <utility>
 7 #include <vector>
 8 #include <map>
 9 #include <queue>
10 #include <stack>
11 #include <cstdlib>
12 #include <deque>
13 #include <set>
14 typedef long long ll;
15 #define lowbit(x) (x&(-x))
16 #define ls l,m,rt<<1
17 #define rs m+1,r,rt<<1|1
18 using namespace std;
19 const int N=2e5+9;
20 int n,k;
21 vector<int>vec[N];
22 int  size[N],id[N],sid[N];
23 int index;
24 void dfs(int u){
25     id[u]=++index;//u在全遍历中的位置
26     sid[index]=u;//在全遍历中位置为index的是u
27     size[u]=1;//初始化容量为1
28     for(int i=0;i<vec[u].size();i++){
29         int v=vec[u][i];
30         dfs(v);
31         size[u]+=size[v];//每个数的实际容量
32     }
33 }
34 int  main()
35 {
36     scanf("%d%d",&n,&k);
37     int  x;
38     for(int i=2;i<=n;i++){
39         scanf("%d",&x);
40         vec[x].push_back(i);
41     }
42     dfs(1);//预处理
43     int u,v;
44     for(int  i=0;i<k;i++){
45         scanf("%d%d",&u,&v);
46         if(v>size[u])  printf("-1\n");
47         else{
48             printf("%d\n",sid[id[u]+v-1]);//id[u]+v-1为从u开始遍历
49             //时第v的数的位置
50         }
51     }
52     return   0;
53 }

猜你喜欢

转载自www.cnblogs.com/tingtin/p/9327288.html