Cod sursa(job #2505265)

Utilizator Ioana_GaborGabor Ioana Ioana_Gabor Data 6 decembrie 2019 16:56:57
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 250000

using namespace std;

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

vector <int> G[NMAX+5];
int n,m,parent[NMAX+5],level[NMAX+5],table[NMAX+5][20],q,p;

void dfs(int varf,int l){
    level[varf]=l;
    for(int i=0;i<G[varf].size();i++){
        dfs(G[varf][i],l+1);
    }
}

int walk(int varf,int dist){
    if(level[varf]<=dist){
        return 0;
    }
    for(int j=18;j>=0;j--){
        if((1<<j)<=dist){
            varf=table[varf][j];
            dist=dist-(1<<j);
        }
    }
    return varf;
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++){
        f>>parent[i];
        G[parent[i]].push_back(i);
    }
    for(int i=1;i<=n;i++){
        if(parent[i]==0){
            dfs(i,1);
        }
    }
    for(int i=1;i<=n;i++){
        table[i][0]=parent[i];
    }
    for(int j=1;j<=19;j++){
        for(int i=1;i<=n;i++){
            if(level[i]>(1<<j)){
                table[i][j]=table[table[i][j-1]][j-1];
            }else{
                table[i][j]=0;
            }
        }
    }
    while(m--){
        f>>q>>p;
        g<<walk(q,p)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}