Cod sursa(job #624136)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 21 octombrie 2011 20:24:32
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <cstdio>

#define NMax 1000005
#define LL long long

using namespace std;

int N, A[NMax], B[NMax], C[NMax];
int Rainbow[NMax], Right[NMax];

void Read ()
{
    freopen ("curcubeu.in", "r", stdin);
    scanf ("%d %d %d %d", &N, &A[1], &B[1], &C[1]);
    Rainbow[1]=-1;
    for (int i=2; i<N; ++i)
    {
        Rainbow[i]=-1;
        A[i]=(int)(((LL)i*(LL)A[i-1])%(LL)N);
        B[i]=(int)(((LL)i*(LL)B[i-1])%(LL)N);
        if (A[i]>B[i])
        {
            int Aux=A[i];
            A[i]=B[i];
            B[i]=Aux;
        }
        C[i]=(int)(((LL)i*(LL)C[i-1])%(LL)N);
    }
}

void Print ()
{
    freopen ("curcubeu.out", "w", stdout);
    for (int i=1; i<N; ++i)
    {
        printf ("%d\n", Rainbow[i]);
    }
}

void Colour (int Index, int X, int Y, int CurrentC)
{
    for (int i=X; i<=Y; )
    {
        if (Rainbow[i]==-1)
        {
            Rainbow[i]=CurrentC;
            Right[Index]=i;
            ++i;
        }
        else
        {
            i=Right[Rainbow[i]]+1;
        }
    }
}

int main()
{
    Read ();
    for (int i=N-1; i>=0; --i)
    {
        Colour (i, A[i], B[i], C[i]);
    }
    Print ();
    return 0;
}