CCCPaste

Untitled

#include 
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
const int logn = 18;
int parent[maxn][logn];
vector depth(maxn, 0);
int kth_ancestor(int node, int k) {
    if(depth[node] < k) {
        return -1;
    }
    for(int i = logn; i >= 0; i--) {
        if(node == -1) {
            break;
        }
        if(k & (1 << i)) {
            node = parent[node][i];
        }
    }
    return node;
}
int main() {
    int n, q;
    cin >> n >> q;
    vector tree(n + 1, -1);
    
    for(int i = 2; i <= n; i++) {
        cin >> tree[i];
        parent[i][0] = tree[i];
    }  
    tree[1] = 1;
    for(int i = 1; i <= n; i++) {
        if(i != 1) {
            depth[i] = depth[tree[i]] + 1;
        }
        parent[i][0] = tree[i];
        for(int j = 1; j <= logn; j++) {
            parent[i][j] = parent[parent[i][j - 1]][j - 1];
        }

    }    
    while(q--) {
        int node, k;
        cin >> node >> k;
        cout << kth_ancestor(node, k) << endl;
    }
    return 0;
}