Cod sursa(job #143847)

Utilizator pitbullpitbulll pitbull Data 26 februarie 2008 21:52:41
Problema Stramosi Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.3 kb
# include <stdio.h>
# include <math.h>
# define IN "stramosi.in"
# define OUT "stramosi.out"
# define MAXLINE 20
# define MAXCOL 350000 
int N,M;

void gaseste(FILE*,int,int);
void solve();
int mat[MAXLINE][MAXCOL];
int parinte(int,int);

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

int mylog(int N){
	int d=1;
	int p=2;
	while(p<N){
		p*=2;
		d++;
	}
	return d-1;
	
}

void genStr(const int count) {  
    int i,dp,j; 
	for (i = 1, dp = (count + 1) >> 1; dp; ++i, dp >>= 1) {  
         for(j = 0; j <= count; ++j) {  
             mat[i][j] = mat[i - 1][mat[i - 1][j]];  
         }  
     }  
} 

void solve(){
	FILE *in=fopen(IN,"rt");
	FILE *out=fopen(OUT,"wt");
	fscanf(in,"%d %d",&N,&M);
	register int i,j;
	for (i=0;i<mylog(N)+1;i++)	
		for (j=1;j<=N;j++)
			mat[i][j]=-1;
	int P,Q;
	for (i=1;i<=N;i++)
		fscanf(in,"%d",&mat[0][i]);
	genStr(N);
	
	for (i=0;i<M;i++){
		fscanf(in,"%d %d",&Q,&P);
		gaseste(out,P,Q);
	}
	fclose(out);		
	fclose(in);
}

void gaseste(FILE* out,int P,int Q){
	//omul are id-ul Q
	//vreau al P-lea parinte
	int i;
	//putem avea maxim 2^18 parinti,aproximez la 2^20
	int p=Q;
	if(P==0)
		p=0;
	else 	
	for (i=20;i>=0;i--)
		if(P & (1 << i ) )
			p=mat[p][i];//afla cel de-al 2^i-lea parinte al lui p
	fprintf(out,"%d\n",p);	
}