Cod sursa(job #1448637)

Utilizator GeiGeiGeorge Cioroiu GeiGei Data 7 iunie 2015 18:22:06
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
//0010
#include <cstdio>

int eb[250050][20];

int main() {
    FILE* fi = fopen("stramosi.in", "rt");
    FILE* fo = fopen("stramosi.out", "wt");

    int n = 0, m = 0;
    //fscanf(fi, "%d%d", &n, &m);
    char c;
    while (true) {
        c = fgetc(fi);
        if (c < '0' || c > '9') {
            break;
        }
        n = (n * 10) + c - '0';
    }
    while (true) {
        c = fgetc(fi);
        if (c < '0' || c > '9') {
            break;
        }
        m = (m * 10) + c - '0';
    }

    for (int i = 1; i <= n; i++) {
     //   fscanf(fi, "%d", &eb[i][0]);
        eb[i][0] = 0;
        while (true) {
            c = fgetc(fi);
            if (c < '0' || c > '9') {
                break;
            }
            eb[i][0] = eb[i][0] * 10 + c - '0';
        }
    }

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

    for (int j = 0; j < k; j++) {
        eb[0][j] = 0;
    }

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

    for (int k = 1; k <= m; k++) {
        int p = 0, q = 0;
        fscanf(fi, "%d%d", &q, &p);
       /* while (true) {
            c = fgetc(fi);
            if (c < '0' || c > '9') {
                break;
            }
            q = q * 10 + c - '0';
        }
        while (true) {
            c = fgetc(fi);
            if (c < '0' || c > '9') {
                break;
            }
            p = p * 10 + c - '0';
        }*/

        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[q][kp];
            }
        }

        fprintf(fo, "%d\n", q);
    }

    return 0;
}