Cod sursa(job #977384)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 25 iulie 2013 19:36:02
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <vector>
using namespace std;

const int MAX_N = 250002;

int N, M;
int dp[MAX_N][20], F[MAX_N], log2[MAX_N];
vector < int > v[MAX_N], Lv[MAX_N];

inline void DFS(int x, int lv) {
    Lv[lv].push_back(x);
    for(size_t i = 0; i < v[x].size(); ++i)
        DFS(v[x][i], lv+1);
}

inline int Query(int x, int k) {
    while(k) {
        int t = log2[k];
        x = dp[x][t];
        k -= (1 << t);
    }
    return x;
}

int main() {
    ifstream f("stramosi.in");
    ofstream g("stramosi.out");

    f >> N >> M;
    for(int i = 1; i <= N; ++i) {
        f >> F[i];
        v[F[i]].push_back(i);
    }

    for(int i = 2; i < MAX_N; ++i)
        log2[i] = log2[i/2] + 1;
    for(int i = 1; i <= N; ++i)
        if(!F[i])
            DFS(i, 0);
    for(int i = 1; i < N; ++i) {
        for(size_t j = 0; j < Lv[i].size(); ++j) {
            int x = Lv[i][j];
            dp[x][0] = F[x];
            for(int k = 1; (1 << k) <= i; ++k)
                dp[x][k] = dp[dp[x][k-1]][k-1];
        }
    }

    for(int i = 1, x, k; i <= M; ++i) {
        f >> x >> k;
        g << Query(x, k) << '\n';
    }

    f.close();
    g.close();

    return 0;
}