Cod sursa(job #156606)

Utilizator vicenzo_cnuStan Alexandru Dan vicenzo_cnu Data 12 martie 2008 17:32:28
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 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;     
 }