Pagini recente » Cod sursa (job #897685) | Cod sursa (job #393877) | Cod sursa (job #601460) | Cod sursa (job #2712801) | Cod sursa (job #3273533)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 1e6 + 5;
long long N, A, B, C;
int sol[N_MAX];
struct Query
{
int A, B, C;
Query() {}
Query(int _A, int _B, int _C):
A(_A), B(_B), C(_C) {}
} Q[N_MAX];
struct DisjointSetUnion /// T[x] = urmatorul spatiu liber dupa x
{
int T[N_MAX];
int N;
int FindSet(int v)
{
if(T[v] != v + 1)
T[v] = FindSet(T[v]);
return T[v];
}
void UnionSet(int a, int b)
{
a = FindSet(a);
b = FindSet(b);
if(a >= b)
return;
T[a] = b;
}
void Build(int N)
{
this->N = N;
for(int i = 0; i <= N; i++)
T[i] = i + 1;
}
} dsu;
void SetInput(string name)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
(void)!freopen((name + ".in").c_str(), "r", stdin);
(void)!freopen((name + ".out").c_str(), "w", stdout);
}
void ReadInput()
{
cin >> N >> A >> B >> C;
}
void Solve()
{
Q[1] = Query(A, B, C);
for(int i = 2; i < N; i++)
{
Q[i].A = (1LL * Q[i-1].A * i) % N;
Q[i].B = (1LL * Q[i-1].B * i) % N;
Q[i].C = (1LL * Q[i-1].C * i) % N;
}
for(int i = N - 1; i >= 1; i--)
{
int st = min(Q[i].A, Q[i].B);
int dr = max(Q[i].A, Q[i].B);
int culoare = Q[i].C;
for(int j = dsu.FindSet(st-1); j <= dr; j = dsu.FindSet(j))
{
sol[j] = culoare;
dsu.UnionSet(j, dr);
}
}
for(int i = 1; i < N; i++)
cout << sol[i] << '\n';
}
int main()
{
SetInput("curcubeu");
ReadInput();
dsu.Build(N);
Solve();
return 0;
}