Cod sursa(job #3950)

Utilizator rapidu36Victor Manz rapidu36 Data 29 decembrie 2006 19:01:25
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb

#include <stdio.h>
#include <string.h>
#include <math.h>

#define fin "stramosi.in"
#define fout "stramosi.out"
#define Nmax 250001
#define logNmax 20

long a[logNmax][Nmax],N,M,b2[1001],r;
FILE *fi,*fo;

long ancestor(long x)
 {
   long i,u;
   for(i=r;i>0;i--)
     if(b2[i])
       u=a[i-1][x], x=u;
   return u;
 }

void solve(void)
 {
    long i,j,k,logN;
    fi=fopen(fin,"r"), fo=fopen(fout,"w");
    fscanf(fi,"%ld %ld\n",&N,&M);
    for(i=1;i<=N;i++) fscanf(fi,"%ld ",&a[0][i]);
    logN=ceil(log(N)/log(2));
    for(k=1;k<=logN;k++)
      for(i=1;i<=N;i++)
	a[k][i]=a[k-1][a[k-1][i]];
    fscanf(fi,"\n");
    for(;M;M--)
      {
	 memset(b2,0,sizeof(b2));
	 fscanf(fi,"%ld %ld\n",&i,&j);
	 for(r=0;j;j/=2) b2[++r]=j%2;
	 k=ancestor(i), fprintf(fo,"%ld\n",k);
      }
    fcloseall();
 }

int main(void)
 {
   solve();
   return 0;
 }