Cod sursa(job #2024918)

Utilizator LucaSeriSeritan Luca LucaSeri Data 21 septembrie 2017 16:21:13
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <bits/stdc++.h>

using namespace std;

const int MaxN = 250100;

int dp[MaxN][20];
int v[MaxN];
int logg[MaxN];

int query(int a, int b){
    while(b){
        a = dp[a][logg[b]];
        b -= 1<<logg[b];
    }
    return a;
}

int main(){
    int n, m;
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);
    scanf("%d%d", &n, &m);

    for(int i = 1; i <= n; ++i){
        scanf("%d", &v[i]);
    }

    logg[2] = 1;
    for(int i = 3; i <= n; ++i){
        logg[i] = logg[i/2]+1;
    }

    for(int i = 1; i <= n; ++i){
        dp[i][0] = v[i];
    }

    for(int j = 1; j <= logg[n]; j++){
        for(int i = 1; i <= n; ++i){
            dp[i][j] = dp[dp[i][j-1]][j-1];
        }
    }

    for(int i = 1; i <= m; ++i){
        int a, b;
        scanf("%d%d", &a, &b);
        printf("%d\n", query(a, b));
    }

    return 0;
}