Cod sursa(job #445047)

Utilizator andrei.12Andrei Parvu andrei.12 Data 22 aprilie 2010 17:04:42
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>

const int lg = 1000002;

long long n, v[lg][3], i;

int h[lg], tata[lg], last[lg], x, y, cur, rsp[lg], nxt;

void leg(int x, int y){
	if (h[x] < h[y])
		tata[x] = y;
	else{
		if (h[x] == h[y])
			h[x] ++;

		tata[y] = x;
	}
}
int find(int x){
	int y, z;

	for (y = x; tata[y]; y = tata[y]);

	for (; tata[x]; ){
		z = tata[x];
		tata[x] = y;
		x = z;
	}

	return y;
}

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

	scanf("%lld%lld%lld%lld", &n, &v[1][0], &v[1][1], &v[1][2]);

	for (i = 2; i < n; i ++){
		v[i][0] = (v[i - 1][0] * i) % n;
		v[i][1] = (v[i - 1][1] * i) % n;
		v[i][2] = (v[i - 1][2] * i) % n;
	}

	for (i = 1; i < n; i ++)
		last[i] = i - 1;

	for (i = n - 1; i; i --){
		x = v[i][0] < v[i][1] ? v[i][0] : v[i][1];
		y = v[i][0] > v[i][1] ? v[i][0] : v[i][1];

		cur = last[ find(x) ] + 1;

		for (; cur < n && cur <= y; cur ++){
			rsp[cur] = v[i][2];

			if (rsp[cur - 1] > 0)
				leg(cur - 1, cur);
			if (cur + 1 < n){
				if (rsp[cur + 1] > 0){
					nxt = last[ find(cur + 1) ];
					leg(cur, cur + 1);

					cur = nxt;
				}
			}
		}

		last[ find(cur - 1) ] = cur - 1;
	}

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

	return 0;
}