Cod sursa(job #2569004)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 4 martie 2020 10:46:42
Problema Atac Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,p,aux1,aux2,n1,n2,nr1,nr2,ans,lca,euler[75003],indexx[32003],kontor,indi[32003],poz[32003],l[75003],rmq[25][75005],str[25][32005],dist[32003],d[25][32005];vector < pair <int,int> > arb[1003];
queue <int> chestie;
void dfs (int nod) {
	indexx[nod]=++kontor;euler[++euler[0]]=indexx[nod];indi[indexx[nod]]=nod;poz[indexx[nod]]=euler[0];
	for(int i=0;i<(int)arb[nod].size();++i)
		if(indexx[arb[nod][i].first]==0) {
			dfs(arb[nod][i].first);
			euler[++euler[0]]=indexx[nod];
		}
}
void build_rmq () {
	rmq[0][1]=euler[1];
	for(int i=2;i<=euler[0];++i)
		rmq[0][i]=euler[i],l[i]=l[(i>>1)]+1;
	for(int k=1;k<=l[euler[0]];++k)
		for(int i=1;i+(1<<k)-1<=euler[0];++i)
			rmq[k][i]=min(rmq[k-1][i],rmq[k-1][i+(1<<(k-1))]);
}
int querrys (int p1, int p2) {
	if(p1>p2)	swap(p1,p2);
	return min(rmq[l[p2-p1+1]][p1],rmq[l[p2-p1+1]][p2-(1<<l[p2-p1+1])]);
}
void bfs () {
	int nod;
	str[0][chestie.front()]=chestie.front();dist[chestie.front()]=1;
	while(!chestie.empty()) {
		nod=chestie.front();
		for(int i=0;i<(int)arb[nod].size();++i) 
			if(dist[arb[nod][i].first]==0) {
				dist[arb[nod][i].first]=dist[nod]+1;
				chestie.push(arb[nod][i].first);str[0][arb[nod][i].first]=nod;d[0][arb[nod][i].first]=arb[nod][i].second;
			}
		chestie.pop();
	}
}
void build_str () {
	d[0][1]=(1<<30);
	for(int k=1;(1<<k)-1<=n;++k)
		for(int i=1;i<=n;++i)
			//if(dist[i]-(1<<k)+1>0)
				str[k][i]=str[k-1][str[k-1][i]],d[k][i]=min(d[k-1][i],d[k-1][str[k-1][i]]);
}
int quer (int nod1, int nod2) {
	aux1=indexx[nod1];aux2=indexx[nod2];lca=indi[querrys(poz[aux1],poz[aux2])];
	nr1=dist[nod1]-dist[lca];nr2=dist[nod2]-dist[lca];ans=1e9;n1=nod1;n2=nod2;
	for(int i=0;nr1>0;++i)
		if((nr1 & (1<<i))!=0) {
			nr1^=(1<<i);
			ans=min(ans,d[i][n1]);n1=str[i][n1];
		}
	for(int i=0;nr2>0;++i)
		if((nr2 & (1<<i))!=0) {
			nr2^=(1<<i);
			ans=min(ans,d[i][n2]);n2=str[i][n2];
		}
	return ans;
}
int main () {
	int nr1,nr2,a,b,c,d,x,y,z;
	freopen("atac.in","r",stdin);
	freopen("atac.out","w",stdout);
	scanf("%d%d%d", &n, &m, &p);++m;++m;
	for(int i=2;i<=n;++i) {
		scanf("%d%d", &nr1, &nr2);
		arb[i].push_back(make_pair(nr1,nr2));arb[nr1].push_back(make_pair(i,nr2));
	}
	//alegem radacina nodul 1;
	dfs(1);build_rmq();chestie.push(1);bfs();build_str();
	//for(int i=1;i<=n;++i)
		//printf("%d %d\n", indexx[i], indi[indexx[i]]);
	//for(int i=1;i<=n;++i)
		//printf("%d ", dist[i]);
	//for(int i=0;(1<<i)-1<=n;++i,printf("\n"))
		//for(int j=1;j<=n;++j)
			//printf("%d ", str[i][j]);
	//return 0;
	scanf("%d%d%d%d%d%d", &x, &y, &a, &b, &c, &d);
	while(--m) {
		z=0;
		if(x!=y)
			z=quer(x,y);
		if(m<=p)
			printf("%d\n", z);
		x=(x*a+y*b)%(n+1);y=(y*c+z*d)%(n+1);
	}
	return 0;
}