Cod sursa(job #2161145)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 11 martie 2018 15:47:58
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>

using namespace std;

int n, m;
int tata[250005][22];

void citire(){
    scanf("%d %d", &n, &m);

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

int logx(int x){
    int sol = 1;
    int ret = 0;

    while(sol <= x){
        sol <<= 1;
        ret++;
    }

    return ret - 1;
}

void construire(){
    int log = logx(n);

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

int query(int x, int y){
    while(y > 0){
        int z = logx(y);

        x = tata[x][z];
        y -= (1 << z);
    }

    return x;
}

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

    citire();
    construire();
    int x, y;

    for(int k = 0; k < m; k++){
        scanf("%d %d", &x, &y);
        printf("%d\n", query(x, y));
    }

    return 0;
}