Cod sursa(job #86040)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 23 septembrie 2007 14:09:09
Problema Curcubeu Scor 50
Compilator cpp Status done
Runda Autumn Warmup 2007, Runda 2 Marime 1.13 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

#define MP make_pair
#define PB push_back

const int NMAX = 1 << 20;

int N, A, B, C;
vector <pair <int, pair <int, int> > > V[NMAX];
priority_queue <pair <int, pair <int, int> > > H;

void read(void) {
	FILE *fin = fopen("curcubeu.in", "rt");

	fscanf(fin, " %d", &N);

	fscanf(fin, " %d %d %d", &A, &B, &C);

	fclose(fin);
}

void numbers(void) {
	int i;

	for (i = 1; i < N; ++i) {
		V[ min(A, B) ].PB( MP( i, MP( max(A, B), C) ) );
		
		A = ((long long) A * (i + 1)) % N;
		B = ((long long) B * (i + 1)) % N;
		C = ((long long) C * (i + 1)) % N;
	}
}

void write(void) {
	FILE *fout = fopen("curcubeu.out", "wt");
	int i, j;

	for (i = 1; i < N; ++i) {
		
		while (!H.empty() && H.top().second.first < i)
			H.pop();

		for (j = 0; j < (int) V[i].size(); ++j)
			H.push( V[i][j] );

		if (H.empty())
			fprintf(fout, "0\n");
		else
			fprintf(fout, "%d\n", H.top().second.second);

	}

	fclose(fout);
}

int main(void) {

//	printf("%d\n", sizeof(V));
//	printf("%d\n", sizeof( pair <int, pair <int, int> > ));

	read();

	numbers();

	write();

	return 0;
}