Cod sursa(job #2506673)

Utilizator vxpsnVictor Pusnei vxpsn Data 8 decembrie 2019 16:58:28
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

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

typedef long long ll;
typedef unsigned long long ull;

const ll nmx = 3e5 + 5;
const ll inf = 1<<30;
const ll MOD = 1e9 + 7;

int N, M, v[nmx], anc[nmx][21], lg[nmx];
vector <int> fiu[nmx];

void dfs(int node, int level) {
    if(v[node] != 0) {
        anc[node][0] = v[node];
        for(int i = 1; (1<<i) < level; ++i) {
            anc[node][i] = anc[anc[node][i - 1]][i - 1];
        }
    }

    for(auto k : fiu[node]) {
        dfs(k, level + 1);
    }
}

int stramos(int node, int k) {
    if(v[node] == 0) return 0;

    int l = lg[k];

    if(anc[node][l] != 0 && (1 << l) == k) {
        return anc[node][l];
    }

    return stramos(anc[node][l], k - (1<<l));
}

int main() {
    ios::sync_with_stdio(0);

    lg[2] = 1;
    for(int i = 3; i <= 250000; ++i) {
        lg[i] = 1 + lg[i / 2];
    }

    in>>N>>M;
    for(int i = 1; i <= N; ++i) {
        in>>v[i];
        if(v[i] != 0) {
            fiu[v[i]].push_back(i);
        }
    }

    for(int i = 1; i <= N; ++i) {
        if(v[i] == 0) {
            dfs(i, 1);
        }
    }

    while(M--) {
        ll P, Q;
        in>>P>>Q;
        out<<stramos(P, Q)<<"\n";
    }

    return 0;
}