Cod sursa(job #522498)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 15 ianuarie 2011 12:25:15
Problema Curcubeu Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <cstdio>
#include <algorithm>

using namespace std;


#define file_in "curcubeu.in"
#define file_out "curcubeu.out"

#define nmax (1<<20)

int n,i,j,N;
int a,b,c;
int cul[nmax<<1];
int tip[nmax<<1];
int cc,t,T;
int A,B,C;


void update(int x, int y ,int nod){
	
	if (A<=x && y<=B){ 
		cul[nod]=C;
		tip[nod]=t;
		return ;
	}
	
	int mij=(x+y)>>1;
	
	if (A<=mij) update(x,mij,2*nod);
	if (B>mij) update(mij+1,y,2*nod+1);
}
	
void query(int x, int y, int nod, int c, int t){
	
	if (tip[nod]>t){
		t=tip[nod];
		c=cul[nod];
	}
	
	if (x==y){
		printf("%d\n", c);
		return ;
	}
	
	int mij=(x+y)>>1;
	
	query(x,mij,2*nod,c,t);
	query(mij+1,y,2*nod+1,c,t);
	
}



int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d %d %d", &N, &A,&B,&C);

	a=A;
	b=B;
	A=min(a,b);
	B=max(a,b);
	update(1,N-1,1);
	A=a;
	B=b;

	for (t=2;t<N;++t){
		A=(1LL*A*t)%N;
		B=(1LL*B*t)%N;
		C=(1LL*C*t)%N;
		a=A;
		b=B;
		A=min(a,b);
		B=max(a,b);
		update(1,N-1,1);
		A=a;
		B=b;
	}

	query(1,N-1,1,-1,-1);

		 
	return 0;
	
}