Cod sursa(job #1791033)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 28 octombrie 2016 23:36:40
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int n,q,i,v[250001],log2[20],p,k,r[250001][20];
inline void BuildRMQ()
{
    int m=log2[n]+1,i,j;
    for(i=1;i<=n;i++)
        r[i][0]=v[i];
    for(j=1;j<m;j++)
        for(i=1;i<=n;i++)
        r[i][j]=r[r[i][j-1]][j-1];
}
inline int stramos(int p,int k)
{
    int j;
    for(j=1;j<=k;j++)
        {
            p=v[p];
            if(!p)
                return 0;
        }
    return p;
}
inline int functie(int p,int k)
{
    bool ok=1;
    for(int i=18;i>=0&&ok;i--)
        if(k&(1<<i))
    {
        ok=0;
        int p2=1<<i;
        int retin=r[p][log2[p2]];
        return stramos(retin,k-p2);
    }
}
int main()
{
    f>>n>>q;
    for(i=1;i<=n;i++)
        f>>v[i];
    log2[1]=0;
    for(i=2;i<=n;i++)
        log2[i]=log2[i/2]+1;
    BuildRMQ();
    for(;q;q--)
    {
        f>>p>>k;//al k lea stramos al lui p
        g<<functie(p,k)<<'\n';
    }
}