Cod sursa(job #2468500)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 5 octombrie 2019 16:23:41
Problema Stramosi Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 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], rmq[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);
        Gph[i].push_back(x);
    }
}

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

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

    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 + 1];
        for(int j = 18; j >= 0; j--){
            if(Pow[siz[Z]] - Pow[j] >= 0){
                if(x - depth[rmq[P][j]] < Q) P = rmq[P][j] - 1;
                else if(x -  depth[rmq[P][j]] == Q){
                    ans = rmq[P][j] - 1;
                    break;
                }
            }
        }
        printf("%d\n", ans);
    }

    return 0;
}