Description

一句话翻译(祈福12月六级考试)
给一棵树,m个查询
每个查询(u, k) 代表 u 节点dfs序下第k个节点

Solution

令l[i] 表示i节点的起点位置,r[i] 表示i节点的终止位置,a[i] 表示第i个数字是哪个节点。
对于每个查询,查找是否在 [l[u], r[u]]区间内,不在的话输出-1,否则输出a[l[u] + k - 1]。

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
vector<int> G[N];
int tot, a[N], l[N], r[N];
void dfs(int u) {
  ++tot;
  a[tot] = u;
  l[u] = tot;
  for(auto &x : G[u]) {
    dfs(x);
  }
  r[u] = tot;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  int n, m; cin >> n >> m;
  for(int i = 2; i <= n; i++) {
    int u; cin >> u;
    G[u].push_back(i);
  }
  dfs(1);
  while(m--) {
    int val, dis; cin >> val >> dis;
    int pos = l[val] + dis - 1;
    if(pos > r[val]) {
      cout << -1 << '\n';
    } else {
      cout << a[pos] << '\n';
    }
  }
  return 0;
}