Cod sursa(job #998112)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 15 septembrie 2013 19:48:21
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>

using namespace std;

#define llint long long int

llint t[1000005],n;
llint lung[1000005];

inline void init(llint n)
{
    llint i;
    for(i=1;i<=n;i++)
        t[i]=0,lung[i]=1;
}

llint gaseste(llint a)
{
    llint r=a;
    while(t[r])
        r=t[r];
    llint x,y;
    x=a;
    while(x!=r)
    {
        y=t[x];
        t[x]=r;
        x=y;
    }
    return r;
}

void uneste(llint a,llint b)
{
    a=gaseste(a);
    b=gaseste(b);
    if(a==b)
        return;
    t[b]=a;
    lung[a]+=lung[b];
}

bool pallinted[1000005];
llint vect[1000005];

void rainbow(llint x,llint y,llint cul)
{
   llint i;
   for(i=x;i<=y;i+=lung[i])
   {
       if(!pallinted[i])
       {
          vect[i]=cul;
          pallinted[i]=1;
          if(i>=2)
             if(pallinted[i-1])
                uneste(i-1,i);
          if(i<n)
             if(pallinted[i+1])
                uneste(i,i+1);
       }
       i=gaseste(i);
   }
}

inline llint minim(llint a,llint b)
{
    if(a<b)
        return a;
    return b;
}

inline llint maxim(llint a,llint b)
{
    if(a>b)
        return a;
    return b;
}

llint a[1000005],b[1000005],c[1000005];

int main()
{
    ifstream cin("curcubeu.in");
    ofstream cout("curcubeu.out");

    llint i,copie;
    cin>>n>>a[1]>>b[1]>>c[1];
    copie=n--;
    init(n);
    for(i=2;i<=n;i++)
       a[i]=((i*a[i-1])%copie),b[i]=((i*b[i-1])%copie),c[i]=((i*c[i-1])%copie);
    for(i=n;i>=1;i--)
    {
        cout<<minim(a[i],b[i])<<' '<<maxim(a[i],b[i])<<' '<<c[i]<<endl;
        rainbow(minim(a[i],b[i]),maxim(a[i],b[i]),c[i]);
    }
    for(i=1;i<=n;i++)
        cout<<vect[i]<<'\n';
    cin.close();
    cout.close();
    return 0;
}