Cod sursa(job #2877815)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 25 martie 2022 13:17:05
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int stramos[250011][20];
int lg[250011],lev[250011],tata[250011];
bool calc[250011],grad[250011];
void stramosi_build(int k)
{
    if(calc[k]==1)
        return;
    stramosi_build(tata[k]);
    lev[k]=lev[tata[k]]+1;
    calc[k]=1;
    for(int i=1;i<=lg[lev[k]];i++)
        stramos[k][i]=stramos[stramos[k][i-1]][i-1];
}
int n,m,i,x,p,l,k;
int main()
{
    f>>n>>m;
    f>>x;
    tata[1]=x;
    grad[x]=1;
    stramos[1][0]=x;
    for(i=2;i<=n;i++)
    {
        lg[i]=lg[i/2]+1;
        f>>x;
        tata[i]=x;
        grad[x]=1;
        stramos[i][0]=x;
    }
    calc[0]=1;
    for(i=1;i<=n;i++)
        if(grad[i]==0)
            stramosi_build(i);
    for(i=1;i<=m;i++)
    {
        f>>l>>p;
        if(p>lev[l])
        {
            g<<0<<'\n';
            continue;
        }
        k=0;
        while(p>0 && l>0)
        {
            if(p%2==1)
                l=stramos[l][k];
            p=p/2;
            k++;
        }
        g<<l<<'\n';
    }
    return 0;
}