Pagini recente » Cod sursa (job #1239006) | Cod sursa (job #3224862) | Cod sursa (job #1767957) | Cod sursa (job #2060901) | Cod sursa (job #2083285)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("curcubeu.in");
ofstream g("curcubeu.out");
const int MaxN = 1000005;
int cols[MaxN], st[MaxN], dr[MaxN], v[MaxN], n, fth[MaxN];
int find_interval(int val)
{
int aux, rez;
aux = val;
while (fth[val] != 0)
val = fth[val];
rez = val;
val = aux;
while (val != rez)
{
aux = fth[val];
fth[val] = rez;
val = aux;
}
return rez;
}
void join(int a, int b)
{
if (a != b) fth[b] = a;
}
int main()
{
f >> n >> st[1] >> dr[1] >> cols[1];
for (int i = 2; i <= n; i++)
st[i] = (1LL *st[i - 1] * i) % n,
dr[i] = (1LL * dr[i - 1] * i) % n,
cols[i] = (cols[i - 1] * i) % n;
--n;
for (int i = n; i >= 1; i--)
{
if (st[i] > dr[i]) swap(st[i], dr[i]);
int poz = st[i];
int auxst = st[i], auxdr = dr[i];
while (poz <= dr[i])
{
while (v[poz] == 0 && poz <= dr[i])
v[poz] = i, ++poz;
if (poz <= dr[i] && v[poz])
{
int x = find_interval(v[poz]);
poz = dr[x] + 1;
join(i, x);
auxst = min(st[x], auxst);
auxdr = max(dr[x], auxdr);
}
}
if (st[i] >= 2 && v[st[i] - 1] > 0)
{
int x = find_interval(v[st[i] - 1]);
join(i, x);
auxst = min(st[x], auxst);
auxdr = max(dr[x], auxdr);
}
if (dr[i] < n && v[dr[i] + 1] > 0)
{
int x = find_interval(v[dr[i] + 1]);
join(i, x);
auxst = min(st[x], auxst);
auxdr = max(dr[x], auxdr);
}
st[i] = auxst;
dr[i] = auxdr;
}
for (int i = 1; i <= n; i++) g << cols[v[i]] << '\n';
return 0;
}