Cod sursa(job #2052632)

Utilizator osiaccrCristian Osiac osiaccr Data 30 octombrie 2017 20:44:16
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#define DEF 250010
#define DEF2 20

using namespace std;

ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");

int T[DEF], //vector de tati
D[DEF2][DEF], //D[k][i] al 2 ^ k lea stramosi al i
log[DEF],
n, m;

int main () {
    fin >> n >> m;;
    for (int i = 1; i <= n; i++) {
        fin >> T[i];
        D[0][i] = T[i];
    }

    for (int k = 1; (1 << k) <= n; k++) {
        bool ok = false;
        for (int i = 1; i <= n; i++) {
            D[k][i] = D[k - 1][i];
            for (int j = 1; j <= (1 << (k - 1)); j++) {
                D[k][i] = T[D[k][i]];
            }
            ok = D[k][i];
        }
        if (!ok)
            break;
    }

    log[1] = 0;
    for (int i = 2; i <= n; i++) {
        log[i] = 1 + log[i / 2];
    }

    for (; m; -- m) {
        int x, y, t;
        fin >> x >> y;
        while (y) {
            x = D[log[y]][x];
            y -= 1 << (log[y]);
        }
        fout << x << "\n";
    }


    return 0;
}