Cod sursa(job #1110930)

Utilizator cbanu96Banu Cristian cbanu96 Data 18 februarie 2014 14:54:48
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[KMAX][1<<KMAX];
int n, m;

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

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[bits.top()][result];
        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[0][i]);
    }

    compute();

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

    return 0;
}