Cod sursa(job #3182362)

Utilizator victor_gabrielVictor Tene victor_gabriel Data 8 decembrie 2023 21:29:19
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int DIM = 250010;
const int LOG_DIM = 20;

int n, m;
int ancestor[LOG_DIM][DIM];

void calcAncestors() {
    for (int p = 1; p < LOG_DIM; p++) {
        for (int i = 1; i <= n; i++)
            ancestor[p][i] = ancestor[p - 1][ancestor[p - 1][i]];
    }
}

int findAncestor(int node, int count) {
    int solNode = node;
    for (int exp = LOG_DIM - 1; exp >= 0; exp--) {
        int pow = (1 << exp);
        if ((count & pow) == pow && solNode > 0) {
            solNode = ancestor[exp][solNode];
            count -= pow;
        }
    }
    return solNode;
}

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

    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> ancestor[0][i];

    calcAncestors();

    for (int i = 1; i <= m; i++) {
        int q, p;
        fin >> q >> p;
        fout << findAncestor(q, p) << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}