Cod sursa(job #86092)

Utilizator victorsbVictor Rusu victorsb Data 23 septembrie 2007 14:50:26
Problema Curcubeu Scor 50
Compilator cpp Status done
Runda Autumn Warmup 2007, Runda 2 Marime 2.24 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define Nmax 1000005
#define mp make_pair
#define x first
#define tip second.first
#define y second.second

int n, ct, hz;
int a[Nmax], b[Nmax], c[Nmax];
int h[Nmax], ind[Nmax];
int d[Nmax];
pair<int, pair<int, int> > ev[2 * Nmax];

void citire()
{
	int i;
	long long tmp;

	scanf("%d", &n);
	scanf("%d %d %d", &a[1], &b[1], &c[1]);
	for (i = 2; i < n; ++i)
	{
		tmp = a[i - 1];
		tmp *= i;
		a[i] = tmp % n;

		tmp = b[i - 1];
		tmp *= i;
		b[i] = tmp % n;

		tmp = c[i - 1];
		tmp *= i;
		c[i] = tmp % n;

		if (a[i] == 0 || b[i] == 0 || c[i] == 0)
			a[i] = b[i] = c[i] = 1;
	}
}

void creste(int i)
{
	int tata, fiu;

	fiu = i;
	tata = fiu / 2;
	
	while (tata > 0)
	{
		if (h[tata] > h[fiu])
			break;

		swap(h[tata], h[fiu]);
		ind[h[tata]] = tata;
		ind[h[fiu]] = fiu;

		fiu = tata;
		tata = fiu / 2;
	}
}

void scade(int i)
{
	int tata, fiu;

	tata = i;
	fiu = tata * 2;

	while (fiu <= hz)
	{
		if (fiu < hz && h[fiu + 1] > h[fiu])
			++fiu;

		if (h[tata]> h[fiu]) break;

		swap(h[tata], h[fiu]);
		ind[h[tata]] = tata;
		ind[h[fiu]] = fiu;

		tata = fiu;
		fiu = tata * 2;
	}
}

void solve()
{
	int i, pos, nod;

	--n;

	/*
    for (i = 1; i <= n; ++i)
		printf("%d %d %d\n", a[i], b[i], c[i]);
	*/

	for (i = 1; i <= n; ++i)
	{
        ev[++ct] = mp(min(a[i], b[i]), mp(1, i));
		ev[++ct] = mp(max(a[i], b[i]), mp(2, i));
	}

	sort(ev+1, ev+ct+1);

	/*
    for (i = 1; i <= ct; ++i)
		printf("%d %d %d\n", ev[i].x, ev[i].tip, ev[i].y);
	*/

	hz = 0;
	pos = 1;
	for (i = 1; i <= n; ++i)
	{
		while (pos <= ct && ev[pos].x == i && ev[pos].tip == 1)
		{
			h[++hz] = ev[pos].y;
			ind[h[hz]] = hz;
			creste(hz);

			//printf("%d -> %d\n", ev[pos].x, ev[pos].tip);

			++pos;
		}

		/*
		printf("h: ");
        for (int j = 1; j <= hz; ++j)
			printf("%d ", h[j]);
		printf("\n");
		*/

		d[i] = c[h[1]];
		//printf("%d\n", c[h[1]]);

		while (pos <= ct && ev[pos].x == i && ev[pos].tip == 2)
		{
			nod = ev[pos].y;

			h[ind[nod]] = h[hz];
			--hz;
			ind[h[ind[nod]]] = ind[nod];
			creste(ind[nod]);
			scade(ind[nod]);

			++pos;
		}
	}

	for (i = 1; i <= n; ++i)
		printf("%d\n", d[i]);
}

int main()
{
	freopen("curcubeu.in", "r", stdin);
	freopen("curcubeu.out", "w", stdout);

	citire();
	solve();

	return 0;
}