Cod sursa(job #298950)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 6 aprilie 2009 15:03:18
Problema Curcubeu Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
using namespace std;

#include <queue>
#include <bitset>

#define f first
#define s second
#define II inline
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define IN  "curcubeu.in"
#define OUT "curcubeu.out"
#define N_MAX 1<<20

typedef vector<int> VI;
typedef pair<int,int> pi;

int N;
vector< pair<pi,pi> > V,A;
priority_queue<int,VI,less<int> > Q;

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d",&N);
	
	V.resize(N);
	scanf("%d%d%d",&V[1].f.f,&V[1].f.s,&V[1].s.f);
	V[1].s.s = 1;
	
	FOR(i,2,N-1)
	{
		V[i].f.f = (V[i-1].f.f * i ) % N;
		V[i].f.s = (V[i-1].f.s * i ) % N;
		if(V[i].f.f > V[i].f.s)
			swap(V[i].f.f,V[i].f.s);
		V[i].s.f = (V[i-1].s.f * i ) % N;
		V[i].s.s = i;
	}
	
	A = V;
	--N;
}

II void solve()
{
	int k = 1;
	sort(V.begin()+1,V.end() );
	
	FOR(i,1,N)
	{
		for(;k <= N && V[k].f.f <= i;Q.push(V[k].s.s),++k);
		for(;!Q.empty() &&  A[ Q.top() ].f.s < i;Q.pop() );
		
		if(Q.empty() )
			printf("0\n");
		else
			printf("%d\n",A[ Q.top() ].s.f);
	}	
}

int main()
{
	scan();
	solve();
	return 0;
}