Cod sursa(job #3318221)

Utilizator Lex._.Lex Guiman Lex._. Data 27 octombrie 2025 16:02:21
Problema Curcubeu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>
#define NMAX 1000001
using namespace std;

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

int a[NMAX], b[NMAX], c[NMAX];
int culori[NMAX]; //culoarea fiecarei casute
int t[NMAX], sz[NMAX]; //tatal fiecarui nod si marimea fiecarei paduri
int max_nod[NMAX]; ///cel mai mare nod din fiecare padure

int radacina(int nod) //radacina nodului
{
    while(t[nod]!=0) nod=t[nod];
    return nod;
}

void merge_padure(int nod1, int nod2) //combina doua paduri 
{
    int radacina_1=radacina(nod1), radacina_2=radacina(nod2);
    if(sz[radacina_1]<sz[radacina_2])
    {
        t[radacina_1]=radacina_2;
        sz[radacina_2]+=sz[radacina_1];
        max_nod[radacina_2]=max(max_nod[radacina_2], max_nod[radacina_1]);
    }
    else
    {
        t[radacina_2]=radacina_1;
        sz[radacina_1]+=sz[radacina_2];
        max_nod[radacina_1]=max(max_nod[radacina_1], max_nod[radacina_2]);
    }
}

int main()
{
    int n;
    in >> n; 
    for(int i=1; i<=n-1; i++)
    {
        sz[i]=1;
        max_nod[i]=i;
    }
    in >> a[1] >> b[1] >> c[1];
    for(int i=2; i<=n-1; i++)
    {
        a[i]=((long long)a[i-1]*i)%n;
        b[i]=((long long)b[i-1]*i)%n;
        c[i]=((long long)c[i-1]*i)%n;
    }
    for(int i=n-1; i>=1; i--) //luam operatiile de la final spre inceput
    {
        for(int j=a[i]; j<=b[i]; j++)
        {
            if(culori[j]==0) ///daca casuta nu a mai fost colorata pana acum
            {
                culori[j]=c[i];
                if(j>a[i]) merge_padure(j-1, j);
            }
            else //daca casuta a mai fost colorata, atunci j face parte dintr-o padure 
            {
                if(j>a[i]) merge_padure(j-1, j);
                j=max_nod[radacina(j)]+1; ///sarim peste toate nodurile din padure
            }
        }
    }
    for(int i=1; i<=n-1; i++) 
    {
        out << culori[i] << "\n";
    }

    return 0;
}