Pagini recente » Cod sursa (job #81863) | Cod sursa (job #365955) | Cod sursa (job #1400396) | Cod sursa (job #244106) | Cod sursa (job #445077)
Cod sursa(job #445077)
#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;
}