Cod sursa(job #2035787)

Utilizator patcasrarespatcas rares danut patcasrares Data 9 octombrie 2017 20:17:04
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<fstream>
#include<vector>
#include<unordered_map>
#include<iostream>
#define P 500
#include<queue>
#include<cmath>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n,m,pr[2][250005],c[250005],nr,a,q,p,ni[250005];
vector<int>x[250005];
void dfs(int nod,int niv)
{
    for(auto i:x[nod])
    {
        ni[i]=niv;
        if(niv%P==0)
            pr[1][i]=i;
        else
            pr[1][i]=pr[1][nod];
        dfs(i,niv+1);
    }
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>pr[0][i];
        c[pr[0][i]]=1;
        x[pr[0][i]].push_back(i);
    }
    for(int i=1;i<=n;i++)
        if(!pr[0][i])
        {
            pr[1][i]=i;
            dfs(i,1);
        }
 //   for(int i=1;i<=n;i++)
        //cout<<ni[i]<<'\n';
    for(int i=1;i<=m;i++)
    {
        fin>>q>>p;
        a=q;
        while(p)
        {
            if(p>P&&a!=pr[1][a])
            {
                p-=ni[a]-ni[pr[1][a]];
                a=pr[1][a];
            }
            else
            {
                p--;
                a=pr[0][a];
            }
        }
        fout<<a<<'\n';
    }
}