Cod sursa(job #445077)

Utilizator andrei.12Andrei Parvu andrei.12 Data 22 aprilie 2010 18:21:42
Problema Curcubeu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>

#define lint long long

const int lg = 1000002;

int n, v[lg][3], i, 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("%d%d%d%d", &n, &v[1][0], &v[1][1], &v[1][2]);

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

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

					cur = nxt;
				}
			}
		}

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

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

	return 0;
}