Cod sursa(job #86038)

Utilizator eferLiviu Ciortea efer Data 23 septembrie 2007 14:08:48
Problema Curcubeu Scor 50
Compilator cpp Status done
Runda Autumn Warmup 2007, Runda 2 Marime 2.12 kb
// Liviu Ciortea, Bucuresti, Romania (TopCoder handle: _efer_)

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <utility>
#include <string>
using namespace std;

#define REP(i, N) for (int i = 0; i < (N); ++i)
#define REPV(i, a, b) for (int i = (a); i <= (b); ++i)
#define REPD(i, N) for (int i = (N)-1; i >= 0; --i)
#define REPVD(i, b, a) for (int i = (b); i >= (a); --i)
#define REPIT(it, v) for (it = (v).begin(); it != (v).end(); ++it)
#define SZ(a) ((int)(a).size())
#define MP make_pair
#define PB push_back
#define X first
#define Y second
#define ALL(a) (a).begin(), (a).end()
#define CLR(a) memset((a), 0, sizeof(a))
#define MSET(a, v) memset((a), v, sizeof(a))
#define CPY(dest, source) memcpy(dest, source, sizeof(dest))

typedef long long LL;
typedef vector<int> VI;
typedef vector<string> VS;
typedef pair<int, int> PII;

const int MAXD = 1<<20;
int col[MAXD];

struct elm {
	int type, time;
	elm() {};
	elm(int ntype, int ntime): type(ntype), time(ntime) {};
};
vector<elm> events[MAXD];

void put(int A, int B, int C, int index) {
	if (A > B) swap(A, B);
	events[A].PB(elm(0, index));
	events[B].PB(elm(1, index));
	col[index] = C;
}

int main() {
	freopen("curcubeu.in", "rt", stdin);
	freopen("curcubeu.out", "wt", stdout);

	int N, A, B, C;
	scanf("%d %d %d %d", &N, &A, &B, &C);
	N--;

	//int M;
	//scanf("%d", &M);
	//REPV(i, 1, M) {
	//	int A, B, C;
	//	scanf("%d %d", &A, &B);
	//	put(A, B, i, i);
	//}

	put(A, B, C, 1);

	REPV(i, 2, N) {
		A = ((LL)A * i) % (N+1);
		B = ((LL)B * i) % (N+1);
		C = ((LL)C * i) % (N+1);
		put(A, B, C, i);
	}

	set<int, greater<int> > indexes;
	indexes.insert(0);

	REPV(i, 1, N) {
		int now = *indexes.begin();
		vector<elm>::iterator it;
		REPIT(it, events[i]) {
			elm e = *it;
			if (e.type) indexes.erase(e.time);
			else {
				now = max(now, e.time);
				indexes.insert(e.time);
			}
		}

		printf("%d\n", col[now]);
	}

	return 0;
}