Cod sursa(job #3276131)

Utilizator Alex_BerbescuBerbescu Alexandru Alex_Berbescu Data 12 februarie 2025 19:11:46
Problema Curcubeu Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#pragma GCC optimize("O3")
#pragma GCC optimize("fast-math")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define ll long long
#define mod 100003




using namespace std;
const int dim = 1e6 + 55;


struct event
{
    int st, dr, color;


};
event stiva[dim];


int a1, b1, c1, n;
int tata[dim], sol[dim];


bool intersec(int a1, int b1, int c1, int d1)
{
    int mini = min(b1, d1);
    int maxi = max(a1, c1);
    return (maxi <= mini);
}


int findu(int x)
{
    if(x == tata[x])
        return x;
    return tata[x] = findu(tata[x]);
}
void unionu(int x, int y)
{
    int a = findu(x);
    int b = findu(y);
    if(a != b)
    {
        tata[b] = a;
    }
}




ifstream fin("curcubeu.in");
ofstream fout("curcubeu.out");



int32_t main(int argc, char * argv[])
{
    fin >> n >> a1 >> b1 >> c1;
    stiva[1] = {min(a1, b1), max(a1, b1), c1};
    tata[1] = 1;
    tata[n] = n;
    for(int i = 2; i < n; ++i)
    {
        a1 = (a1 * i) % n;
        b1 = (b1 * i) % n;
        c1 = (c1 * i) % n;
        stiva[i] = {min(a1, b1), max(a1, b1), c1};
        tata[i] = i;
    }
    for(int i = n - 1; i >= 1; --i)
    {
        int poz = findu(stiva[i].st);
        while(poz <= stiva[i].dr)
        {
            sol[poz] = stiva[i].color;
            tata[poz] = stiva[i].dr + 1;
            poz = findu(poz + 1);
        }
    }
    for(int i = 1; i < n; ++i)
        fout << sol[i] << '\n';
    return 0;

}