Cod sursa(job #3342627)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 25 februarie 2026 08:13:33
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
#define cin ci
#define cout co
#pragma GCC optimize("03,unroll-loops")
using namespace std;
ifstream cin("curcubeu.in");
ofstream cout("curcubeu.out");
int n, a1, b1, c1;
vector<int> a, b, c;
vector<int> par, siz;
int findroot(int node)
{
    if(node == par[node])
        return node;
    return par[node] = findroot(par[node]);
}
void unionset(int node1, int node2)
{
    node1 = findroot(node1);
    node2 = findroot(node2);

    if(node1 == node2)
        return;
    if(siz[node1] < siz[node2])
        swap(node1, node2);
    if(siz[node1] == siz[node2])
        siz[node1] ++;
    par[node2] = node1;
}
int main()
{
    cin >> n >> a1 >> b1 >> c1;
    a.resize(n + 5);
    b.resize(n + 5);
    c.resize(n + 5);
    par.resize(n + 5);
    siz.resize(n + 5);
    for(int i = 1; i <= n; i ++)
    {
        par[i] = i;
        siz[i] = 1;
    }
    a[1] = a1, b[1] = b1, c[1] = c1;
    for(int i = 2; i < n; i ++)
    {
        a[i] = (1ll * a[i - 1] * i) % n;
        b[i] = (1ll * b[i - 1] * i) % n;
        c[i] = (1ll * c[i - 1] * i) % n;
    }
    vector<int> ans(n + 5);
    for(int i = n - 1; i >= 1; i --)
    {
        int color = c[i];
        int dr = max(b[i], a[i]);
        int st = min(b[i], a[i]);
        while(dr >= st)
        {
            dr = findroot(dr);

            ans[dr] = c[i];
            par[dr] = dr - 1;

            dr --;
        }

    }
    for(int i = 1; i < n; i ++)
        cout << ans[i] << '\n';
    return 0;
}