Cod sursa(job #113981)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 12 decembrie 2007 00:43:35
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cstdio>

#define fin  "atac.in"
#define fout "atac.out"

#define DBGx

const int Nmax = 32011;

int N,M,P,str[Nmax][22],minc[Nmax][22];
int tat[Nmax],cost[Nmax],adc[Nmax];

int X,Y,Z,A,B,C,D;

int min(int a,int b) { ( a < b ) ? (a) : (a=b); return a; };

int swap(int &a,int &b) 
{
	int aux;
	aux=a; a=b; b=aux;
}

int df(int x)
{
	if ( adc[x] ) 
		return adc[x];
	adc[x]=1+df(tat[x]);
	return adc[x];
}

int query(int x,int y)
{
	int k,ret;

	if ( adc[x] == adc[y] )
	{
		ret=1000100;
		
		if ( x == y ) return ret;

		for ( k = 0 ; k < 22 && str[x][k] != str[y][k]; ++k )
		{
			ret = min(ret,minc[x][k]);
			ret = min(ret,minc[y][k]);
		}

		--k;

		if ( k < 0 ) 
		{
			++k;
			ret = min(ret,minc[x][k]);
			ret = min(ret,minc[y][k]);
		}

		return min(ret,query(str[x][k],str[y][k]));
	}

	if ( adc[x] < adc[y] ) 
		swap(x,y);
	
	for ( k=0 ; adc[y] + ( 1 << k ) <= adc[x] ; ++k );

	--k;	

	return min(minc[x][k],query(str[x][k],y));
}

void solve()
{
	int i,j;

	adc[1]=1;	//radacina

	for (i=1;i<=N;++i)
		df(i);

#ifdef DBG
	for (i=1;i<=N;++i)
		printf("%d ",adc[i]);
	printf("\n\n");
#endif

	for (i=1;i<=N;++i)
	{
		minc[i][0]=cost[i];
		 str[i][0]=tat[i];
	}

//aflu stramosii
	for (j=1;j<22;++j)
	for (i=1;i<=N;++i)
	if ( adc[i] > ( 1 << j ) )
		str[i][j] = str[ str[i][j-1] ][ j - 1 ];	
	
#ifdef DBG
	for (i=1;i<=N;++i)
	{
		for (j=0;j<=4;++j)
			printf("%d ",str[i][j]);
		printf("\n");	
	}
	printf("\n");
#endif

//aflu drumul minim dintre un nod x si stramosii lui pe put de 2
	for (j=1;j<22;++j)
	for (i=1;i<=N;++i)
	if ( adc[i] > ( 1 << j ) )
		minc[i][j] = min(minc[i][j-1],minc[ str[i][j-1] ][ j - 1 ]);

#ifdef DBG
	for (i=1;i<=N;++i)
	{
		for (j=0;j<=4;++j)
			printf("%d ",minc[i][j]);
		printf("\n");	
	}
	printf("\n");
#endif

//incep queryurile

	/*
	freopen(fout,"w",stdout);

	for ( i=1;i<=M;++i )
	{
		Z = query(X,Y);
	
		if ( X == Y ) Z = 0;

		X = ( X*A + Y*B ) % N + 1;
		Y = ( Y*C + Z*D ) % N + 1;

		if ( i + P > M )
			printf("%d\n",Z);
	}
	*/
}

void readdata()
{
	int i;

	freopen(fin,"r",stdin);

	scanf("%d%d%d",&N,&M,&P);

	for (i=1;i<N;++i)
		scanf("%d%d",&tat[i+1],&cost[i+1]);

	scanf("%d%d%d%d%d%d",&X,&Y,&A,&B,&C,&D);
}

int main()
{
	
	readdata();
	solve();

	return 0;
}