Cod sursa(job #202944)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 12 august 2008 13:06:01
Problema Atac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#include <stdlib.h>
#define N 32001
#define INF 2000000000
int *a[N],n,m,m2,L[3*N],T[3*N],P[N][20],C[N][20];
int c[N],*b[N];
void level(int x,int l,int t){
	for(int i=1;i<=a[x][0];i++)
		if(a[x][i]!=t){
			T[a[x][i]]=x;
			L[a[x][i]]=l+1;
			c[a[x][i]]=b[x][i];
			level(a[x][i],l+1,x);
		}
}
inline int min(int x,int y){
	if(x>y) return y;
	return x;
}
void precalc(){
	int i,j;
	L[1]=1; level(1,1,-1);
	for(i=1;i<=n;i++)
		for(j=1;1<<j <=n;j++)
			P[i][j]=-1,C[i][j]=-1;
	for(i=1;i<=n;i++)
		P[i][0]=T[i],C[i][0]=c[i];
	for(j=1;1<<j <=n;j++)
		for(i=2;i<=n;i++){
			P[i][j]=P[P[i][j-1]][j-1];
			C[i][j]=min(C[i][j-1],C[P[i][j-1]][j-1]);
		}
}
int RMQ(int p, int q){
	int log,i,cost=INF;
	if(L[p]<L[q]){
		int tmp=p;p=q;q=tmp;
	}
	for(log=1;1<<log<=L[p];log++); log--;
	for(i=log;i>=0;i--)
		if(L[p] - (1<<i) >=L[q]){
			cost=min(cost,C[p][i]);
			p=P[p][i];
		}
	if(p==q)
		return cost;
	for(i=log;i>=0;i--)
		if(P[p][i]!=-1 && P[p][i]!=P[q][i]){
			cost=min(cost,min(C[p][i],C[q][i]));
			p=P[p][i];q=P[q][i];
		}
	return min(cost,min(C[p][0],C[q][0]));
}
int main(){
	int i,u,v,A,B,C,D,X,Y,Y2,X2,z;
	freopen("atac.in","r",stdin);
	freopen("atac.out","w",stdout);
	scanf("%d%d%d",&n,&m,&m2);
	for(i=1;i<=n;i++){
		a[i]=(int*)malloc(4);a[i][0]=0;
		b[i]=(int*)malloc(4);
	}
	for(i=2;i<=n;i++){
		scanf("%d%d",&u,&v);
		a[u][0]++;a[i][0]++;
		a[u]=(int*)realloc(a[u],(a[u][0]+1)*4);a[i]=(int*)realloc(a[i],(a[i][0]+1)*4);
		b[u]=(int*)realloc(b[u],(a[u][0]+1)*4);b[i]=(int*)realloc(b[i],(a[i][0]+1)*4);
		a[u][a[u][0]]=i;a[i][a[i][0]]=u; b[u][a[u][0]]=v; b[i][a[i][0]]=v;
		//c[i]=v;
	}
	c[1]=INF;
	precalc();
	scanf("%d%d%d%d%d%d",&X,&Y,&A,&B,&C,&D);
	if(X!=Y) z=RMQ(X,Y);
	else z=0;
	if(m==m2) printf("%d\n",z);
	for(i=2;i<=m;i++){
		X2=(X*A+Y*B)%n +1;
		Y2=(Y*C+z*D)%n +1;
		if(X2!=Y2) z=RMQ(X2,Y2);
		else z=0;
		if(i>=m-m2+1)
			printf("%d\n",z);
		X=X2;Y=Y2;
	}
	return 0;
}