Cod sursa(job #1968554)

Utilizator RobybrasovRobert Hangu Robybrasov Data 17 aprilie 2017 19:02:57
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <bitset>
#define FOR(i, n) for (int i = 1; i <= n; ++i)
#define iter vector<int>::iterator
#define N 250001

using namespace std;

bitset<N> E;
vector<int> L[N], V[N], S;

void dfs(int node) {
    E[node] = 1;
    S.push_back(node);
    for (iter it = L[node].begin(); it != L[node].end(); ++it)
        dfs(*it);
    int len = S.size();
    for (int step = 1, k = 0; step < len; step <<= 1, ++k) {
        V[node].push_back(S[len - step - 1]);
    }
    S.pop_back();
}

int main() {
    ifstream fin("stramosi.in");
    ofstream fout("stramosi.out");
    int n, m;
    fin >> n >> m;
    FOR(i, n) {
        int x;
        fin >> x;
        if (x)
            L[x].push_back(i);
    }
    
    FOR(i, n) {
        if (!E[i]) {
            dfs(i);
        }
    }

    while (m--) {
        int node, p;
        fin >> node >> p;
        int step = 1;
        for (int k = 0; k < V[node].size() && step <= p; step <<= 1, ++k)
            if (step & p)
                node = V[node][k];
        fout << (step > p ? node : 0) << "\n";
    }
    
    return 0;
}