Cod sursa(job #2445984)

Utilizator CharacterMeCharacter Me CharacterMe Data 6 august 2019 16:32:33
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#define maxl int(log2(250001)+2)
using namespace std;
int n, m, i, j;
int sol[maxl][250001], level[250001], dad[250001];
bool rad[250001];
vector<int> graph[250001];

void read();
void prep();
void solve();
void dfs(int node, int cnt);
int main()
{
    read();
    prep();
    solve();
    return 0;
}
void read(){
    freopen("stramosi.in", "r", stdin);
    scanf("%d%d", &n, &m);
    for(i=1; i<=n; ++i){
        int head;
        scanf("%d", &head);
        dad[i]=head;
        if(head) graph[head].push_back(i);
        else rad[i]=true;
    }
    return;
}
void prep(){
    level[0]=-1;
    for(i=1; i<=n; ++i) if(rad[i]) dfs(i, 0);
    return;
}
void solve(){
    freopen("stramosi.out", "w", stdout);
    for(i=1; i<=m; ++i){
        int node, p;
        scanf("%d%d", &node, &p);
        if(p>level[node]){printf("0\n"); continue;}
        while(p){
            int j=int(log2(p));
            node=sol[j][node];
            p=p-(1<<j);
        }
        printf("%d\n", node);
    }
    return;
}
void dfs(int node, int cnt){
    level[node]=level[dad[node]]+1;
    sol[0][node]=dad[node];
    int j, next=dad[node];
    for(j=1; (1<<j)<=cnt; ++j){
        sol[j][node]=sol[j-1][next];
        next=sol[j-1][next];
    }
    for(auto i:graph[node]) if(i!=dad[node]){
        dad[i]=node;
        dfs(i, cnt+1);
    }
    return;
}