Cod sursa(job #519634)

Utilizator loginLogin Iustin Anca login Data 6 ianuarie 2011 00:54:49
Problema Atac Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
# include <fstream>
# include <iostream>
# include <cstdio>
# include <vector>
# include <algorithm>
# define DIM 32003
# define pb push_back
# define min(a,b) a<b?a:b
using namespace std;
struct nod {
	int i, c;
	nod(){}
	nod(int I, int C){
		i=I;c=C;}
	};
int n, m, p, A, B, C, D, X, Y, Z, t[20][DIM], b[20][DIM], gr[DIM];
vector<nod>G[DIM];

void read ()
{
	ifstream fin ("atac.in");
	fin>>n>>m>>p;
	int u, v;
	for(int i=1;i<n;++i)
	{
		t[0][i+1]=-1;
		fin>>u>>v;
		G[u].pb(nod(i+1, v));
		G[i+1].pb(nod(u, v));
	}
	fin>>X>>Y>>A>>B>>C>>D;
}	

void DF (int k)
{
	for(vector<nod>::iterator I=G[k].begin();I<G[k].end();++I)
		if (t[0][I->i]==-1)
		{
			gr[I->i]=gr[k]+1;
			t[0][I->i]=k;
			b[0][I->i]=I->c;
			DF(I->i);
		}
}

void comp ()
{
	DF(1);
	int cont=1;
	for(int i=1;cont;++i)
	{
		cont=0;
		for(int j=1;j<=n;++j)
			if (t[i-1][t[i-1][j]])
			{
				cont=1;
				t[i][j]=t[i-1][t[i-1][j]];
				b[i][j]=min(b[i-1][j],b[i-1][t[i-1][j]]);
			}
	}
}

int bmb ()
{
	int x, y, sol=10*DIM, mij=0, st, dr, cont, i;	
	if (gr[X]<gr[Y])x=X, y=Y;
	else x=Y, y=X;
	while (gr[x]!=gr[y])
	{
		if (t[0][y] && gr[t[0][y]]==gr[x])
			sol=min(sol,b[0][y]), y=t[0][y];
		else
		{
			for(i=0;gr[t[i][y]]>gr[x];++i);
			sol=min(sol,b[i-1][y]);
			y=t[i-1][y];
		/*	cont=1;
			for(st=0, dr=15, mij=(st+dr)/2;cont;mij=(st+dr)/2)
				if (st==dr)cont=0;
				else if (gr[t[mij][y]]>gr[x])st=mij+1;
				else dr=mij;
			sol=min(sol,b[mij][y]);
			y=t[mij][y];*/
		}		
	}
	cont=1;
	if (x==y)cont=0;
	while (cont)
	{
		if (t[0][x]==t[0][y])
			sol=min(sol,(min(b[0][x],b[0][y]))), cont=0;
		else
		{
			for(i=0;t[i][x]!=t[i][y];++i);
			sol=min(sol,(min(b[i-1][x],b[i-1][y])));
			x=t[i-1][x];
			y=t[i-1][y];
		/*	cont=1;
			for(st=0, dr=15, mij=(st+dr)/2;cont;mij=(st+dr)/2)
				if (st==dr)cont=0;
				else if (t[mij][y]==t[mij][x])dr=mij;
				else st=mij+1;
			sol=min(sol,(min(b[mij][x],b[mij][y])));
			x=t[mij][x];
			y=t[mij][y];*/
		}
	}
	return sol;
}
	
void solve ()
{
	freopen("atac.out", "w", stdout);
	for(int i=1;i<=m;++i)
	{
		if (X==Y)
			Z=0;
		else
			Z=bmb();
		X=(X*A+Y*B)%n+1;
		Y=(Y*C+Z*D)%n+1;
		if (i>=m-p+1)printf("%d\n", Z);
	}
}

int main ()
{
	read ();
	comp ();
	solve ();

	return 0;
}