Cod sursa(job #1100940)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 7 februarie 2014 18:01:03
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <cstdio>
#include <cmath>
#define Nmax 250005

using namespace std;

int N,tata[Nmax],dp[Nmax][25],Log2[Nmax];

inline void RMQ()
{
    int i,j;
    for(i=1;i<=N;++i)
        dp[i][0]=tata[i];
    for(i=1;i<=N;++i)
        for(j=1;j<=20;++j)
            dp[i][j]=dp[dp[i][j-1]][j-1];

    Log2[1]=0;
    for(i=2;i<=Nmax;++i)
    {
        Log2[i]=Log2[i-1];
        if((1<<Log2[i]+1)<=i)
            ++Log2[i];
    }
}

int main()
{
    int M,x,y,i,p;
    freopen ("stramosi.in","r",stdin);
    freopen ("stramosi.out","w",stdout);
    scanf("%d%d", &N,&M);
    for(i=1;i<=N;++i)
        scanf("%d", &tata[i]);
    RMQ();

    while(M--)
    {
        scanf("%d%d", &x,&y);
        while(y)
        {
            p=Log2[y];
            x=dp[x][p];
            y-=(1<<p);
        }
        printf("%d\n", x);
    }
    return 0;
}