Cod sursa(job #2024921)

Utilizator LucaSeriSeritan Luca LucaSeri Data 21 septembrie 2017 16:26:50
Problema Stramosi Scor 0
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[logg[b]][a];
        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[0][i] = v[i];
    }

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

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

    return 0;
}