Cod sursa(job #3190102)

Utilizator radu._.21Radu Pelea radu._.21 Data 6 ianuarie 2024 23:29:42
Problema Curcubeu Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>

using namespace std;
long long n;
long long A[1000001],B[1000001],C[1000001];
long long tata[1000001],sol[1000001];
long long root(long long nod){
    while(tata[nod]<0)
       return nod;
    long long rad  = root(tata[nod]);
    tata[nod]= rad;
    return rad;
}
ifstream fin("curcubeu.in");
ofstream fout("curcubeu.out");

void unite(int x,int y){
    x = root(x);
    y = root(y);
    if(x!=y){
        if(x>y)
            swap(x,y);
        tata[y]+=tata[x];
        tata[x]=y;
    }


}

int main(){
    fin>>n>>A[1]>>B[1]>>C[1];
    tata[1]=-1;
    for(int i=2;i<n;i++){
        A[i]=(A[i-1]*i)%n;
        B[i]=(B[i-1]*i)%n;
        C[i]=(C[i-1]*i)%n;
        if(A[i]>B[i])
            swap(A[i],B[i]);
        tata[i]=-1;
    }
    for(int i=n-1;i>=1;i--){
        long long st = A[i];
        while(st<=B[i]){
            if(sol[st]>0){ /// nu a fost facut nicio culoare
                st = root(st)+1;
            }
            else{
                if(sol[st-1]>0)
                    unite(st-1,st);
               if(sol[st+1]>0)
                    unite(st,st+1);
                 sol[st]=C[i];
               st++;
            }
        }
    }
    for(int i=1;i<n;i++)
        fout<<sol[i]<<'\n';




    return 0;
}