Cod sursa(job #2648087)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 8 septembrie 2020 16:44:27
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 250005;

int dad[N][20], parent[N];

void binary_lift(int n)
{
    for(int i = 1; i <= n; ++i) {
        dad[i][0] = parent[i];
    }
    for(int j = 1; (1 << j) <= n; ++j) {
        for(int i = 1; i <= n; ++i) {
            dad[i][j] = dad[dad[i][j - 1]][j - 1];
        }
    }
}

int find_asc(int k, int lvl)
{
    for(int i = 18; i >= 0 && lvl > 0 && k > 0; --i) {
        if(lvl >= (1 << i)) k = dad[k][i], lvl -= (1 << i);
    }
    if(lvl > 0) return 0;
    return k;
}

int main()
{
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);

    int n, q;

    scanf("%d%d", &n, &q);
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &parent[i]);
    }
    binary_lift(n);
    for(int i = 1; i <= q; ++i) {
        int x, y;

        scanf("%d%d", &x, &y);
        printf("%d\n", find_asc(x, y));
    }
    return 0;
}