Cod sursa(job #1909)

Utilizator demonuTeodor Stoenescu demonu Data 15 decembrie 2006 11:58:03
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>

const char *fin = "stramosi.in";
const char *fout = "stramosi.out";

int n, m;
int str[20][250100];

inline void genStr(const int count) {
    for (int i = 1, dp = (count + 1) >> 1; dp; ++i, dp >>= 1) {
        for(int j = 0; j <= count; ++j) {
            str[i][j] = str[i - 1][str[i - 1][j]];
        }
    }
}

int getStr(int q, int p) {
    int c = 0;
    //p >>= 1;
    while (p) {
        if (p & 1) {
            q = str[c][q];
        }
        c++;
        p >>= 1;
    }
    return q;
}

int main() {
    FILE *fi = fopen(fin, "rt"), *fo = fopen(fout, "wt");
    fscanf(fi, "%d %d", &n, &m);
    for (int i = 1; i <= n; ++i){
        fscanf(fi, "%d", &str[0][i]);
    }
    str[0][0] = 0;
    genStr(n);

    int p = 0, q = 0;
    for (int i = 0; i  <m; ++i) {
        fscanf(fi, "%d %d", &q, &p);
        fprintf(fo, "%d\n", getStr(q, p));
    }

    fclose(fi);
    fclose(fo);
    return 0;
}