Cod sursa(job #1205018)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 4 iulie 2014 18:34:13
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("atac.in");
ofstream o("atac.out");
const int inf = 1000000000;
int n,m,y,x,a,b,c,d,p,t[32200],v[32100],l[32100],di[20][32020],pi[20][32009];
int lca(int q,int p){
	if(l[q]>l[p])swap(p,q);
	int log1,log2;
	for(log1=0;(1<<log1)<=l[p];log1++);log1--;
	for(log2=0;(1<<log2)<=l[q];log2++);log2--;
	int minim=inf;
	for(int i=log1;i>=0;i--)
	 if(l[q]<=l[p] - (1<<i)) {
	 	minim = min(minim,pi[i][p]);
	 	p = di[i][p];
	 }
	 if(p==q)return minim;
	 for(int i=log2;i>=0;i--)
	 if(di[i][q]!=di[i][p] && di[i][p]!=0 ) {
	 	minim = min(minim,min(pi[i][q],pi[i][p]));
	 	p = di[i][p];
	 	q = di[i][q];
	 }
	 return min(minim,min(v[q],v[p]));
	 
	
}
int main(){
	f>>n>>m>>p;
	l[1]=0;
	int lmax=1;
	for(int i=2;i<=7;i++){
		f>>x>>y;
		t[i]=x;
		v[i]=y;
		l[i] = l[x]+1;
		lmax=max(lmax,l[i]);
	}
	v[1]=inf;
	t[1]=0;
	for(int j=1;j<=n;j++)pi[0][j] = v[j], di[0][j]=t[j];
	
	for(int i=1;(1<<i)<=lmax;i++){
		for(int j=1;j<=n;j++)
		  {
		  	pi[i][j] = min(pi[i-1][j],di[i-1][j]!=0?pi[i-1][di[i-1][j]]:inf);
		  	di[i][j] = di[i-1][j]!=0 ? di[i-1][di[i-1][j]] : 0;
		  }
	}
/*	for(int i=0;(1<<i)<=lmax;i++){
		for(int j=1;j<=n;j++)
		  {
		  	o<<di[i][j]<<" ";
		  }
		  o<<endl;
		  }
		  o<<endl;
		  for(int i=0;(1<<i)<=lmax;i++){
		for(int j=1;j<=n;j++)
		  {
		  	o<<pi[i][j]<<" ";
		  }
		  o<<endl;
		  }
		  */
	
	f>>x>>y>>a>>b>>c>>d;
	int z,y1,x1;
	for(int i=1;i<=m ;i++){
		z = lca(x,y);
		if(m-p<i)o<<z<<"\n";
		x1 = (a*x+b*y)%n+1;
		y1 = (y*c+d*z)%n+1;	
		y=y1;x=x1;
		
	}
}