Cod sursa(job #1100934)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 7 februarie 2014 17:42:37
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#define Nmax 250005

using namespace std;

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

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];
}

inline int Put(int x)
{
    int i;
    for(i=0;(1<<i)<x;++i);
    return i;
}

int main()
{
    int M,x,y,i,p,t;
    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);
        if(!(y&(y-1)))
        {
            y=Put(y);
            printf("%d\n", dp[x][y]);
        }
        else
        {
            for(i=0;1;++i)
            {
                p=y-(1<<i);
                if(!(p&(p-1)))
                {
                    t=Put(p);
                    printf("%d\n", dp[dp[x][i]][t]);
                    break;
                }
            }
        }
    }
    return 0;
}