Pagini recente » Cod sursa (job #1711914) | Cod sursa (job #2590909) | Cod sursa (job #2110944) | Cod sursa (job #2262979) | Cod sursa (job #86092)
Cod sursa(job #86092)
#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 1000005
#define mp make_pair
#define x first
#define tip second.first
#define y second.second
int n, ct, hz;
int a[Nmax], b[Nmax], c[Nmax];
int h[Nmax], ind[Nmax];
int d[Nmax];
pair<int, pair<int, int> > ev[2 * Nmax];
void citire()
{
int i;
long long tmp;
scanf("%d", &n);
scanf("%d %d %d", &a[1], &b[1], &c[1]);
for (i = 2; i < n; ++i)
{
tmp = a[i - 1];
tmp *= i;
a[i] = tmp % n;
tmp = b[i - 1];
tmp *= i;
b[i] = tmp % n;
tmp = c[i - 1];
tmp *= i;
c[i] = tmp % n;
if (a[i] == 0 || b[i] == 0 || c[i] == 0)
a[i] = b[i] = c[i] = 1;
}
}
void creste(int i)
{
int tata, fiu;
fiu = i;
tata = fiu / 2;
while (tata > 0)
{
if (h[tata] > h[fiu])
break;
swap(h[tata], h[fiu]);
ind[h[tata]] = tata;
ind[h[fiu]] = fiu;
fiu = tata;
tata = fiu / 2;
}
}
void scade(int i)
{
int tata, fiu;
tata = i;
fiu = tata * 2;
while (fiu <= hz)
{
if (fiu < hz && h[fiu + 1] > h[fiu])
++fiu;
if (h[tata]> h[fiu]) break;
swap(h[tata], h[fiu]);
ind[h[tata]] = tata;
ind[h[fiu]] = fiu;
tata = fiu;
fiu = tata * 2;
}
}
void solve()
{
int i, pos, nod;
--n;
/*
for (i = 1; i <= n; ++i)
printf("%d %d %d\n", a[i], b[i], c[i]);
*/
for (i = 1; i <= n; ++i)
{
ev[++ct] = mp(min(a[i], b[i]), mp(1, i));
ev[++ct] = mp(max(a[i], b[i]), mp(2, i));
}
sort(ev+1, ev+ct+1);
/*
for (i = 1; i <= ct; ++i)
printf("%d %d %d\n", ev[i].x, ev[i].tip, ev[i].y);
*/
hz = 0;
pos = 1;
for (i = 1; i <= n; ++i)
{
while (pos <= ct && ev[pos].x == i && ev[pos].tip == 1)
{
h[++hz] = ev[pos].y;
ind[h[hz]] = hz;
creste(hz);
//printf("%d -> %d\n", ev[pos].x, ev[pos].tip);
++pos;
}
/*
printf("h: ");
for (int j = 1; j <= hz; ++j)
printf("%d ", h[j]);
printf("\n");
*/
d[i] = c[h[1]];
//printf("%d\n", c[h[1]]);
while (pos <= ct && ev[pos].x == i && ev[pos].tip == 2)
{
nod = ev[pos].y;
h[ind[nod]] = h[hz];
--hz;
ind[h[ind[nod]]] = ind[nod];
creste(ind[nod]);
scade(ind[nod]);
++pos;
}
}
for (i = 1; i <= n; ++i)
printf("%d\n", d[i]);
}
int main()
{
freopen("curcubeu.in", "r", stdin);
freopen("curcubeu.out", "w", stdout);
citire();
solve();
return 0;
}