Cod sursa(job #299208)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 6 aprilie 2009 17:06:04
Problema Curcubeu Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
using namespace std;

#include <queue>
#include <bitset>

#define f first
#define s second
#define II inline
#define ll long long
#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 last,stv[N_MAX],N,T[N_MAX],C[N_MAX];
vector< pair<pi,int> > V;

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);
	
	FOR(i,2,N-1)
	{
		V[i].f.f = ( (ll)V[i-1].f.f * (ll)i) % N;
		V[i].f.s = ( (ll)V[i-1].f.s * (ll)i) % N;
		V[i].s = ( (ll)V[i-1].s * (ll)i ) % N;
	}
	
	FOR(i,1,N-1)
		if(V[i].f.f > V[i].f.s)
			swap(V[i].f.f,V[i].f.s);
	--N;
}

II int rep(int x)
{
	stv[last=1] = x;
	for(;;)
	{
		if(T[x] != x)
		{
			stv[++last] = T[x],x = T[x];
			continue;
		}	
		FOR(i,1,last)
			T[ stv[i] ] = x;
		return x;
	}	
}

II void add(int x,int y)
{
	T[x] = y;
}

II void solve()
{
	int r1,r2;
	
	T[0] = 1;
	FOR(i,1,N)
		T[i] = i;
	T[N+1] = N;	
	
	for(int i=N;i>=1;--i)
		for(int j= (rep(V[i].f.f)==V[i].f.f?V[i].f.f:rep(V[i].f.f) + 1);j <= V[i].f.s;j = rep(j)+1)
		{
			C[j] = V[i].s;
			if(C[j-1] && (r1=rep(j-1)) ^ (r2=rep(j)) )
				add(r1,r2);
			if(C[j+1] && (r1=rep(j-1)) ^ (r2=rep(j+1)) )
				add(r1,r2);
		}	
	FOR(i,1,N)
		printf("%d\n",C[i]);	
}

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