Cod sursa(job #2506680)

Utilizator vxpsnVictor Pusnei vxpsn Data 8 decembrie 2019 17:04:57
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 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], lvl[nmx];
vector <int> fiu[nmx];

int stramos(int node, int k) {
    if(v[node] == 0 || k > lvl[node] - 1) 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];
        lvl[i] = lvl[i - 1] + 1;
        if(v[i] != 0) {
            anc[i][0] = v[i];
            for(int j = 1; (1<<j) < lvl[i]; ++j) {
                anc[i][j] = anc[anc[i][j - 1]][j - 1];
            }
        }
    }

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

    return 0;
}