Cod sursa(job #1110824)

Utilizator cbanu96Banu Cristian cbanu96 Data 18 februarie 2014 13:37:47
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#include <stack>

#define FILEIN "stramosi.in"
#define FILEOUT "stramosi.out"
#define KMAX 18

using namespace std;

int P[1<<KMAX][KMAX];
int n, m;

void compute() {
    for ( int j = 1; 1<<j <= n; j++ ) {
        for ( int i = 1; i <= n; i++ ) {
            P[i][j] = P[P[i][j-1]][j-1];
        }
    }
}

int query(int q, int p) {

    int result = q;
    stack<int> bits;
    int poz = 0;
    while (p != 0) {
        if (p % 2)
            bits.push(poz);
        p /= 2;
        poz++;
    }

    while (!bits.empty() && result != 0) {
        result = P[result][bits.top()];
        bits.pop();
    }

    return result;
}

int main() {
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);

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

    compute();

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

    return 0;
}