Cod sursa(job #156086)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 12 martie 2008 12:42:13
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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;   
}