Cod sursa(job #2105561)

Utilizator xRoALexBirtoiu Alexandru xRoALex Data 13 ianuarie 2018 16:49:13
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
#define Nmax 250005

using namespace std;

int t[20][Nmax],m,n;

FILE *in=fopen("stramosi.in","r");
FILE *out=fopen("stramosi.out","w");

void precalc()
{
    for(int d=1; (1<<d)<=n;d++)
        for(int j=1;j<=n;j++)
            t[d][j] = t[d-1][t[d-1][j]];
}

int query(int q,int p)
{
    int pas=1,ct=0;
    while(pas <= p)
        {
            pas*=2;
            ct++;
        }
    pas/=2;
    ct--;
    while(p)
    {
        if(p>=pas)
        {
            q = t[ct][q];
            p = p - pas;
        }
        pas/=2;
        ct--;
    }
    return q;
}

int main()
{
    fscanf(in,"%d%d",&n,&m);

    for(int i=1;i<=n;i++)
        fscanf(in,"%d",&t[0][i]);

    precalc();

    while(m--)
    {
        int q,p;
        fscanf(in,"%d%d",&q,&p);
        fprintf(out,"%d\n",query(q,p));
    }
    return 0;
}