Cod sursa(job #2161184)

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

using namespace std;

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

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

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

int logx(){
    int val = 0;

    for(int i = 1; i <= n; i++){
        if(i == (1 << (val + 1))){
            val++;
        }

        log[i] = val;
    }
}

void construire(){
    int logxx = log[n];

    for(int i = 1; i <= logxx; 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 = log[y];

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

    return x;
}

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

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

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

    return 0;
}