Cod sursa(job #1448845)

Utilizator GeiGeiGeorge Cioroiu GeiGei Data 8 iunie 2015 00:17:39
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
//0010
#include <cstdio>

long eb[20][250050];

int cit() {
    int ans = 0;
    char c = getchar();
    while (c < '0' || c > '9') {
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        ans = (ans << 3) + (ans << 1) + (c - '0');
        c = getchar();
    }
    return ans;
}

void afis(int n) {
    int l = 0;
    char c[20];
    if (n == 0) {
        putchar('0');
    }
    while (n > 0) {
        c[l++] = n % 10 + '0';
        n /= 10;
    }
    for (int i = l - 1; i >= 0; i--) {
        putchar(c[i]);
    }
    putchar('\n');
}

int main() {
  //  FILE* fi = fopen("stramosi.in", "rt");
  //  FILE* fo = fopen("stramosi.out", "wt");
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);

    long n = cit(), m = cit();

    for (long i = 1; i <= n; i++) {
        eb[0][i] = cit();
    }

    long aux = n, k = 0;
    while (aux > 0) {
        k++;
        aux >>= 1;
    }

    for (long i = 0; i < k; i++) {
        eb[i][0] = 0;
    }

    for (long i = 1; i < k; i++) {
        for (long j = 1; j <= n; j++) {
            eb[i][j] = eb[i - 1][eb[i - 1][j]];
        }
    }

    for (long w = 1; w <= m; w++) {
        long q = cit(), p = cit();

        int v[20], kp = 0;

        while (p > 0) {
            v[kp] = p % 2;
            p >>= 1;
            kp++;
        }

        while (kp > 0) {
            kp--;
            if (v[kp] == 1) {
                q = eb[kp][q];
            }
        }

        afis(q);
    }

    return 0;
}