Cod sursa(job #1815577)

Utilizator antracodRadu Teodor antracod Data 25 noiembrie 2016 14:25:44
Problema Stramosi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n,m;


int a[25002][25];

void build()
{
    for(int i=1; i<=n; i++)
    {
        int x;
        in>>x;
        a[i][1]=x;
        for(int j=2; j<30; j++)
        {
            if(a[a[i][j-1]][j-1]!=0)
            {
                a[i][j]=a[a[i][j-1]][j-1];
            }
            else
            {
                break;
            }
        }
    }
}
int pow(int x)
{
    int i;
    for(i=1; i<=x; i=i*2)
    {}
    i=i/2;
    return i;
}
int detaux(int x)
{
    int k=0;
    while(x!=0)
    {
        k++;
        x=x/2;
    }
    return k;
}
int solve(int p,int q)
{
    int sol;
    int power=pow(p);
    p-=power;
    int aux=detaux(power);
    if(p==0)
        return a[q][aux];
    else if(a[q][aux]==0)
        return 0;
    else if(a[q][aux]!=0)
    {
        q=a[q][aux];
        sol=solve(p,q);
    }

    return sol;
}

int main()
{
    in>>n>>m;
    build();
    for(int i=1; i<=m; i++)
    {
        int p,q;
        in>>q>>p;
        out<<solve(p,q)<<'\n';
    }

}