Cod sursa(job #3038229)

Utilizator rastervcrastervc rastervc Data 26 martie 2023 23:57:49
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <fstream>
#include <vector>

using namespace std;

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

constexpr int LIM = 250005;
constexpr int LOG2_LIM = 20;

int N, M, father[LIM], dp[LIM][LOG2_LIM];
int node, P;
vector<int> G[LIM];

inline void dfs(int node, int level, int lg_level) {
    if (level == (1 << (lg_level + 1))) ++lg_level;

    dp[node][0] = father[node];
    for (int i = 1; i <= lg_level; ++i)
        dp[node][i] = dp[dp[node][i - 1]][i - 1];

    for (const int adj : G[node])
        if (adj != father[node]) dfs(adj, level + 1, lg_level);
}

int main() {
    fin >> N >> M;
    for (int i = 1; i <= N; ++i) {
        fin >> father[i];
        G[father[i]].push_back(i);
    }

    dfs(0, 0, -1);
 
    for (int i = 1; i <= M; ++i) {
        fin >> node >> P;
        for (int j = 0; P; P >>= 1, ++j)
            if (P & 1) node = dp[node][j];
        fout << node << '\n';
    }

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