Cod sursa(job #389870)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 2 februarie 2010 13:28:11
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<cstdio>
#include<vector>
using namespace std;
#define N 32001
#define OO 1<<30
#define minn(a,b) ((a<b)?(a):(b))
vector<int>gr(N,0),dist(N,0);
vector<int>c(N,0);
int n,m,k,z,a,b,c1,d,x,y;
void df(int x)
{
	if (gr[x]==x)
	{
		dist[x]=1;
		return;
	}
	df(gr[x]);
	dist[x]=1+dist[gr[x]];
}
void solve(int x,int y)
{
	z=OO;
	if (dist[x]<dist[y])
		swap(x,y);
	while (dist[x]>dist[y])
	{
		z=minn(z,c[x]);
		x=gr[x];
	}
	while (x!=y)
	{
		z=minn(z,c[x]);
		z=minn(z,c[y]);
		x=gr[x];
		y=gr[y];
	}
}
void citire()
{
	freopen("atac.in","r",stdin);
	freopen("atac.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	for (int i=2; i<=n; ++i)
		scanf("%d%d",&gr[i],&c[i]);
	for (int i=1; i<=n; ++i)
		if (!dist[i])
			df(i);
	scanf("%d%d%d%d%d%d",&x,&y,&a,&b,&c1,&d);
	solve(x,y);
	for (int i=1; i<=m; ++i)
	{
		x=((x*a)%n+(y*b)%n)%n+1;
		y=((y*c1)%n+(z*d)%n)%n+1;
		solve(x,y);
		if (m-k+1<=i)
			printf("%d\n",z);
	}
}
int main()
{
	citire();
	return 0;
}