Cod sursa(job #998933)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 18 septembrie 2013 19:38:11
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>

using namespace std;

int n,tata[250005];
int din[18][250005];
int log2[250005];

inline void calc_log()
{
    int i=2;
    log2[1]=0;
    for(;i<=n;i++)
        log2[i]=log2[i/2]+1;
}

void precalc()
{
    int i,j,lg=log2[n];
    for(i=1;i<=n;i++)
        din[0][i]=tata[i];
    for(i=1;i<=lg;i++)
        for(j=1;j<=n;j++)
            din[i][j]=din[i-1][din[i-1][j]];

}

#define lsb(x) (x&(-x))

int main()
{
  //  ifstream cin("stramosi.in");
  //  ofstream cout("stramosi.out");
    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);
    int i,m=0,a,l,rasp,k;
    //cin>>n>>m;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        //cin>>tata[i];
        scanf("%d",&tata[i]);
    calc_log();
    precalc();
    for(i=0;i<m;i++)
    {
        //cin>>a>>l;
        scanf("%d%d",&a,&l);
        rasp=a;
        while(l)
        {
            k=log2[lsb(l)];
            rasp=din[k][rasp];
            l-=lsb(l);
        }
        //cout<<rasp<<'\n';
        printf("%d\n",rasp);
    }

    //cin.close();
    //cout.close();
    return 0;
}