Cod sursa(job #1110938)

Utilizator cbanu96Banu Cristian cbanu96 Data 18 februarie 2014 15:05:51
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <stack>
#include <set>

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

using namespace std;

int P[KMAX][1<<KMAX];
int n, m;
set<int> Set;

void compute() {
    for ( int i = 1; i <= n; i++ ) {
        Set.insert(i);
    }

    for ( int j = 1; 1<<j <= n; j++ ) {
        for ( set<int>::iterator iter = Set.begin(); iter != Set.end(); iter++ ) {
            int i = *iter;
            P[i][j] = P[P[i][j-1]][j-1];
            if (!P[i][j]) {
                Set.erase(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[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;
}