Cod sursa(job #1815596)

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

using namespace std;

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

int n,m;
int z;

int a[250002][25];
int log[250003];
void build()
{
    for(int i=1; i<=n; i++)
    {
        int x;
        in>>x;
        a[i][1]=x;
        for(int j=2; j<19; j++)
        {
            if(a[a[i][j-1]][j-1]!=0)
            {
                a[i][j]=a[a[i][j-1]][j-1];
            }
            else
            {
                break;
            }
        }
    }
    for(int i = 2; i <= 250001; ++i)
        log[i] = log[i/2] + 1;
}
int pow(int x)
{
    int i;
    z=1;
    for(i=1; i<=x; i=i*2)
    {z++;}
    z=z-1;
    i=i/2;
    return i;
}

int solve(int p,int q)
{
    int sol;
    int power=(1<<(log[p]));
    int aux=log[p*2];
    p-=power;
    if(p==0)
        return a[q][aux];
    else if(a[q][aux]==0)
        return 0;
    else
    {
        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';
    }
}