Cod sursa(job #3232086)

Utilizator anamaria29sSuditu Ana-Maria anamaria29s Data 28 mai 2024 20:27:29
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

ifstream f("stramosi.in");
ofstream g("stramosi.out");

const int MAXN = 250000;
const int LOG = 18;

vector<int> ancestor[MAXN + 1];
int lift[MAXN + 1][LOG];

void preprocess(int N) {
    for (int i = 1; i <= N; ++i) {
        lift[i][0] = ancestor[i][0];
    }

    for (int j = 1; (1 << j) <= N; ++j) {
        for (int i = 1; i <= N; ++i) {
            if (lift[i][j - 1] != 0) {
                lift[i][j] = lift[lift[i][j - 1]][j - 1];
            } else {
                lift[i][j] = 0;
            }
        }
    }
}

int getKAncestor(int node, int k) {
    for (int j = 0; j < LOG; ++j) {
        if (k & (1 << j)) {
            node = lift[node][j];
            if (node == 0) {
                break;
            }
        }
    }
    return node;
}

int main() {
    int N, M;
    f >> N >> M;

    for (int i = 1; i <= N; ++i) {
        int anc;
        f >> anc;
        ancestor[i].push_back(anc);
    }

    preprocess(N);

    for (int i = 0; i < M; ++i) {
        int Q, P;
        f >> Q >> P;
        g << getKAncestor(Q, P) << "\n";
    }

    return 0;
}