Cod sursa(job #143982)

Utilizator pitbullpitbulll pitbull Data 26 februarie 2008 23:50:08
Problema Stramosi Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.12 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 genereazaMatricea() {  
	int p,i;
	for (p=1;p<=N;p++)
		for (i=1;i<=mylog(N);i++)
			mat[i][p]=mat[i-1][mat[i-1][p]];    	 
} 

void solve(){
	FILE *in=fopen(IN,"rt");
	FILE *out=fopen(OUT,"wt");
	fscanf(in,"%d %d",&N,&M);
	register int i;
	int P,Q;
	for (i=1;i<=N;i++)
		fscanf(in,"%d",&mat[0][i]);
	//mat[0][0]=0;
	genereazaMatricea();
	
	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;
	for (i=20;i>=0;i--)
		if(P & (1 << i ) )
			p=mat[i][p];//afla cel de-al 2^i-lea parinte al lui p
	fprintf(out,"%d\n",p);	
}