Cod sursa(job #86066)

Utilizator peanutzAndrei Homorodean peanutz Data 23 septembrie 2007 14:31:13
Problema Curcubeu Scor 20
Compilator cpp Status done
Runda Autumn Warmup 2007, Runda 2 Marime 1.64 kb
#include <stdio.h>

#define NMAX 1000010

int a[NMAX*3];

inline int MIN(int a, int b) { return (a < b) ? (a) : (b); }
inline int MAX(int a, int b) { return (a > b) ? (a) : (b); }

#define mid(st, dr) (((st)+(dr)) >> 1)
#define left(i) ((i) << 1)
#define right(i) (((i) << 1)+1)

int c, res;

void update(int n, int st, int dr, int x, int y)
{
    //printf("st = %d, dr = %d, c = %d, x = %d, y = %d\n", st, dr, c, x, y);
    //printf("%d %d\n", st, dr);
    //if(dr < st)
      //    {printf("<"); return ;}

	if(x <= st && dr <= y)
	{
        //printf("ok\n");
		a[n] = c;
	}
	if(st == dr)
		return ;
	
	int m = mid(st, dr);
	if(x <= m)
		update(left(n), st, m, x, y);
	if(y > m)
		update(right(n), m+1, dr, x, y);
}

void query(int n, int st, int dr, int x)
{
	if(st == dr && st == x)
	{
		res = a[n];
		return ;
	}
    if(st != dr)
    {

	int m = mid(st, dr);

	if(x <= m)
		query(left(n), st, m, x);
	else
		query(right(n), m+1, dr, x);
    }
}

/*
void print(int n)
{
	int x;
	for(x = 1; x < n; ++x)
	{

		query(1, 1, n-1, x);
		printf("%d ", res);
	}
    printf("\n");
}
*/

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

	int n, a, b, i, x, y;
	scanf("%d %d %d %d", &n, &a, &b, &c);	

	for(i = 1; i < n;)
	{
		x = MIN(a, b);
		y = MAX(a, b);

		update(1, 1, n-1, x, y);

		//printf("%d %d %d\n", a, b, c);
		//print(n);

		++i;
		a = (a * i) % n;
		b = (b * i) % n;
		c = (c * i) % n;
	}
	for(x = 1; x < n; ++x)
	{
		query(1, 1, n-1, x);
		printf("%d\n", res);
	}

	return 0;
}