Cod sursa(job #4090)

Utilizator rapidu36Victor Manz rapidu36 Data 30 decembrie 2006 12:14:03
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
/*
#include<stdio.h>
#include<math.h>
#define N 250001
#define M 300001
#define L 18
int n,m,a[N][L];
int stra(int q,int p){
	int x=q,r,j=0;
	while(p){
		r=p&1;
		if(r)
			x=a[x][j];
		j++;
		p>>=1;
	}
	return x;
}
int main(){
	FILE *in=fopen("stramosi.in","r"),*out=fopen("stramosi.out","w");
	int i,j,p,q,ll;
	fscanf(in,"%d%d",&n,&m);
	for(i=1;i<=n;i++)
		fscanf(in,"%d",&a[i][0]);
	ll=(int)floor(log(n)/log(2));
	for(j=1;j<L;j++)
		for(i=1;i<=n;i++)
			a[i][j]=a[a[i][j-1]][j-1];
	for(;m;m--){
		fscanf(in,"%d%d",&q,&p);
		fprintf(out,"%d\n",stra(q,p));
	}
	fclose(in);
	fclose(out);
	return 0;
}
*/
#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;
}
int ancestor(long q,long p){
	long x=q,r,j=0;
	while(p){
		r=p&1;
		if(r)
			x=a[j][x];
		j++;
		p>>=1;
	}
	return x;
}

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,j), fprintf(fo,"%ld\n",k);
	}
    fclose(fi);
	fclose(fo);
}
int main(void)
{
	solve();
	return 0;
}