Cod sursa(job #2073622)

Utilizator sergiudnyTritean Sergiu sergiudny Data 23 noiembrie 2017 13:51:52
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>
#define DM 250005
#define pb push_back
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

vector<int>v[DM],leaf[DM];
int n,m,curr,k,fr[DM],aux;
set<int>roots;

struct elm{
    int ind, dist;
}correspLeaf[DM];

void getAns(int nod, int k){
    if(roots.find(nod)!=roots.end()){
        fout<<0<<'\n';
        return;
    }
    int leafInd = correspLeaf[nod].ind,dist = correspLeaf[nod].dist;
    if(dist+k>=leaf[leafInd].size()){
        fout<<0<<'\n';
        return;
    }
    fout<<leaf[leafInd][dist+k]<<'\n';
}

void construct(int nod){
    int i = nod;
    leaf[i].pb(i);
    correspLeaf[i]={i,0};
    while(v[nod].size()){
        leaf[i].pb(v[nod][0]);
        nod=v[nod][0];
        correspLeaf[nod]={i,leaf[i].size()};
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i){
        fin>>aux;
        if(!aux) roots.insert(i);
        else v[i].pb(aux), fr[aux]++;
    }

    for(int i=1;i<=n;++i) if(!fr[i])
        construct(i);

    for(int i=1;i<=m;++i){
        fin>>curr>>k;
        getAns(curr,k);
    }

    return 0;
}