Cod sursa(job #159498)

Utilizator FlorinC1996Florin C FlorinC1996 Data 14 martie 2008 10:37:14
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>        
int v[250005], a[31][250005], pt[31];   
int poz (int p, int q){        
    int li=0, ls=30, x;        
    while (li<=ls){        
        x=(li+ls)/2;        
        if (pt[x]<q&&pt[x+1]>=q)        
            return x;        
        else       
            if (pt[x]<q)        
                li=x+1;        
            else         
                ls=x-1;        
    }        
    return -1;        
}        
int main()        
{        
    freopen("stramosi.in","r",stdin);        
    freopen("stramosi.out","w",stdout);        
    int i, j, nrt, t, n, p, q, y, s;        
    scanf("%d%d",&n,&t);        
    for (i=1;i<=n;i++)        
        scanf("%d",&v[i]);        
    for (i=1;i<=n;i++)        
        a[0][i]=v[i];        
    pt[0]=1;        
    for (i=1;i<=30;i++){        
        for (j=1;j<=n;j++)        
            a[i][j]=a[i-1][a[i-1][j]];        
        pt[i]=2*pt[i-1];        
    }        
    for (nrt=1;nrt<=t;nrt++){        
        scanf("%d%d",&p,&q);        
        s=0;        
        while (q!=1){        
            y=poz(p,q);        
            if (y==-1){        
                s=1;        
                printf("0\n");        
                break;        
            }        
            p=a[y][p];        
            q=q-pt[y];        
        }        
        if (!s)        
            printf("%d\n",v[p]);        
    }        
    fclose(stdin);        
    fclose(stdout);        
    return 0;        
}