Cod sursa(job #202295)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 7 august 2008 12:06:15
Problema Atac Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
using namespace std;

#include <cstdio>
#include <algorithm>
#include <vector>

#define IN "atac.in"
#define OUT "atac.out"

#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<15
#define M_MAX 1<<15

typedef struct nod
{
	int x, c;
	nod *a;
} *pNod;
pNod v[32005];

int hg[N_MAX];
int CS[N_MAX],tata[N_MAX];
int q,rez,s,f;
int maxhg,Z,X,Y,A,B,C,D,P,N,M;
bool viz[N_MAX];

void add(int x, int y, int c)
{
	pNod p;
	p = new nod;
	p -> x = y;
	p -> c = c;
	p -> a = v[x];
	v[x] = p;
}

void scan()
{
	int x,y;
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d%d\n", &N,&M,&P);
	
	FOR(i,1,N-1)
	{
		scanf("%d%d\n", &x,&y);
		add(i+1,x,y);
		add(x,i+1,y);
	}
	scanf("%d%d%d%d%d%d",&X,&Y,&A,&B,&C,&D);
}

void DF(int nod, int niv)
{
	viz[nod] = 1;
	pNod p;
	hg[nod] = niv;
	for (p = v[nod]; p != NULL; p = p -> a)
		if( !viz[p -> x] ) 
		{
			tata[p -> x] = nod;
			CS[p -> x] = p -> c;
			DF(p -> x, niv + 1);
		}
}

int find(int x, int y)
{
	int minim = 1<<30;
	if( hg[x] > hg[y])
	while( hg[x] != hg[y])
	{
		minim = min(minim,CS[x]);
		x = tata[x];
	}
	else 
		if (hg[x] < hg[y])
			while (hg[x] != hg[y])
			{
				minim = min(minim,CS[y]);
				y = tata[y];
			}
	while (x != y)
	{
		minim = min(minim,CS[x]);
		minim = min(minim,CS[y]);
		x = tata[x]; y = tata[y];
	}
	return minim;

}

void solve()
{
	FOR(i,1,M)
	{
		rez =  1<<30;
		rez = find(X,Y);
		if(X == Y)
			rez=0;
		
		if(i > M-P)
			printf("%d\n", rez);
		Z = rez;
		
		X = (X*A + Y*B) % N + 1;
		Y = (Y*C + Z*D) % N + 1;
	
	}
}

int main()
{
	scan();
	DF(1,1);
	solve();
	return 0;
}