Cod sursa(job #3273533)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 2 februarie 2025 16:06:19
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#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;
}