Cod sursa(job #202378)

Utilizator hadesgamesTache Alexandru hadesgames Data 7 august 2008 21:39:13
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
ifstream in("atac.in");
ofstream out("atac.out");
int poz[100000],log[100000],maxad,put[40],n;
vector<pair<int,int> >euler,tata(33000);
vector<vector<pair<int,int> > > a(33000),b(30,vector<pair<int,int> >(33000)),lca(30,vector<pair<int,int> >(33000));
void dfs(int x)
{
	int adancime=0;
	poz[x]=euler.size();
	if (x!=1)
		adancime=euler.back().ss+1;
	maxad=max(maxad,adancime);
	euler.pb(mp(x,adancime));
	//cout<<x<<' '<<adancime<<'\n';
	vector<pair<int,int> >::iterator it;
	fori(it,a[x])
	{
		dfs(it->ss);
		euler.pb(mp(x,adancime));
	}
}
void rmq()
{
	int i,j;
	FOR(i,0,euler.size()-1)
		lca[0][i]=mp(euler[i].ss,i);
	FOR(j,1,log[euler.size()])
	{
		FOR(i,0,euler.size()-put[j])
			lca[j][i]=min(lca[j-1][i],lca[j-1][i+put[j-1]]);
	}
	//cout<<n<<'\n';
}
void drum_minim()
{
	int i,j;
//	cout<<n<<'\n';
	FOR(i,1,n)
		b[0][i]=tata[i];
	FOR(j,1,log[maxad+1])
	{
		FOR(i,1,n)
		if(euler[poz[i]].ss>=put[j])
		{
			b[j][i].fs=min(b[j-1][i].fs,b[j-1][b[j-1][i].ss].fs);
			b[j][i].ss=b[j-1][b[j-1][i].ss].ss;
	//		if(j==1&&i==3)
	//			cout<<"HAI FRATE";
		}
	//	else
	//		cout<<i<<' '<<euler[poz[i]].ss<<' '<<put[j]<<'\n';
	}
}
int cauta(int x,int y)
{
	if (y==0)
		return 1<<30;
	//cout<<log[y]<<' '<<x<<'\n';
	return min(b[log[y]][x].fs,cauta(b[log[y]][x].ss,y-put[log[y]]));
}
int bombe(int x,int y)
{
	if(poz[x]>poz[y])
		swap(x,y);
	pair<int,int> nod=min(lca[log[poz[y]-poz[x]+1]][x],lca[log[poz[y]-poz[x]+1]][poz[y]-put[log[poz[y]-poz[x]+1]]+1]);
	//cout<<(euler[poz[x]].ss-euler[nod.ss].ss)<<' '<<(euler[poz[y]].ss-euler[nod.ss].ss)<<'\n';
	return min(cauta(x,euler[poz[x]].ss-euler[nod.ss].ss),cauta(y,euler[poz[y]].ss-euler[nod.ss].ss));
}
int main()
{
	int i,m,p,x,y,z,A,B,C,D;
	in>>n>>m>>p;
	FOR(i,2,n)
	{
		in>>x>>y;
		a[x].pb(mp(y,i));
		tata[i]=mp(y,x);
	}
	dfs(1);
	log[1]=0;
	x=2;
	y=1;
	FOR(i,2,euler.size()) //calc log si put
	{
		if (x==i)
		{
			x*=2;
			y++;
		}
		log[i]=y-1;
	}
	put[0]=1;
	for(i=1;i<=29;i++)
		put[i]=put[i-1]*2;
	rmq();
	drum_minim();
	//cout<<tata[6].fs<<' '<<tata[6].ss<<'\n';
	in>>x>>y>>A>>B>>C>>D;
	z=bombe(x,y);
	//cout<<b[1][3].fs<<'\n';
	//cout<<x<<' '<<y<<' '<<z<<'\n';
	if (p==m)
		out<<z<<'\n';
	FOR(i,2,m)
	{
		x=(x*A+y*B)%n+1;
		y=(y*C+z*D)%n+1;
		z=bombe(x,y);
		if (i>=m-p+1)
			out<<z<<'\n';
	}
	in.close();
	out.close();
	return 0;
}