Cod sursa(job #230373)
#include<stdio.h>
int n, nr, x[1000002], t[1000005], f[1000005];
typedef struct
{
int a, b, c;
} culoare;
culoare v[1000002];
inline int min(int x, int y) { return x < y ? x : y;}
inline int max(int x, int y) { return x > y ? x : y;}
int get_root(int x)
{
while (x != t[x]) x = t[x];
return x;
}
void doit()
{
int i;
nr = n - 1; t[1] = f[1] = 1;
for (i = 2; i < n; i++)
{
v[i].a = ((v[i - 1].a % n) * (i % n)) % n;
v[i].b = ((v[i - 1].b % n) * (i % n)) % n;
v[i].c = ((v[i - 1].c % n) * (i % n)) % n;
t[i] = f[i] = i;
}
}
int main()
{
freopen("curcubeu.in","r",stdin);
freopen("curcubeu.out","w",stdout);
scanf("%d",&n);
scanf("%d %d %d",&v[1].a, &v[1].b, &v[1].c);
int i, j, xx, yy, tt;
doit();
for (i = n - 1; i >= 1; i--)
{
xx = min(v[i].a, v[i].b);
yy = max(v[i].a, v[i].b);
int root = get_root(xx);
j = f[root];
while (j <= yy)
{
if (!x[j])
{
x[j] = v[i].c;
nr--;
}
if (x[j]) t[j] = root;
tt = j;
j = f[j] + 1;
f[tt] = f[yy];
if (!nr) break;
}
if (!nr) break;
}
for (i = 1; i < n; i++) printf("%d\n",x[i]);
return 0;
}