Cod sursa(job #2468516)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 5 octombrie 2019 16:38:09
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define MAX 131072

using namespace std;
const int NMAX = 250010;

FILE *IN;

int N, M, P;
bool seen[NMAX];
int depth[NMAX], dp[NMAX][19], Pow[19], siz[NMAX];
int stiv[NMAX], stsize;
vector <int> Gph[NMAX];

int pos, sign;
char f[MAX];

inline void Read(int &nr){
    sign = 0;
    nr = 0;
    while(f[pos] < '0' || f[pos] > '9'){
        if(f[pos] == '-') sign = 1;
        pos++;
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    while(f[pos] >= '0' && f[pos] <= '9'){
        nr = 10 * nr + f[pos++] - '0';
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    if(sign) nr =- nr;
}

void read(){
    int x;
    Read(N); Read(M);
    for(int i = 1; i <= N; i++){
        Read(x);
        Gph[x].push_back(i);
    }
}

void DFS(int node, int val){
    seen[node] = true;
    depth[node] = val;

    int k = 0;
    while(stsize - Pow[k] >= 0){
        dp[node][k] = stiv[stsize - Pow[k]];
        k++;
    }
    siz[node] = k;
    stiv[stsize++] = node;

    for(int i = 0; i < Gph[node].size(); i++){
        int x = Gph[node][i];
        if(!seen[x]) DFS(x, val + 1);
    }
    stiv[stsize--] = 0;
}

void cr_pow(){
    Pow[0] = 1;
    for(int i = 1; i < 19; i++)
        Pow[i] = Pow[i - 1] * 2;
}

int main(){

    IN = fopen("stramosi.in", "r");
    freopen("stramosi.out", "w", stdout);

    read();
    cr_pow();

    DFS(0, 0);

    int P, Q, ans, x, Z;
    for(int i = 1; i <= M; i++){
        Read(P); Read(Q); Z = P;
        ans = 0; x = depth[P];
        for(int j = siz[P]; j >= 0; j--){
            if(x - depth[dp[P][j]] < Q) P = dp[P][j];
            else if(x - depth[dp[P][j]] == Q){
                ans = dp[P][j];
                break;
            }
        }
        if(Q == 0)
            printf("%d\n", Z);
        else printf("%d\n", ans);
    }

    return 0;
}