Cod sursa(job #991427)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 30 august 2013 15:19:20
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 1000005;

unsigned A[Nmax], B[Nmax], C[Nmax];
unsigned Next[Nmax], answer[Nmax];

int N;

void read()
{
    ifstream f("curcubeu.in");

    f >> N >> A[1] >> B[1] >> C[1];

    f.close();
}

void gen()
{
    for ( int i = 2; i < N; ++i )
    {
        A[i] = ( A[i - 1] * i * 1LL );
        B[i] = ( B[i - 1] * i * 1LL );
        C[i] = ( C[i - 1] * i * 1LL );

        if ( A[i] >= N )    A[i] -= N;
        if ( B[i] >= N )    B[i] -= N;
        if ( C[i] >= N )    C[i] -= N;
    }

    for ( int i = 1; i <= N; ++i )
            Next[i] = i;
}

void solve()
{
    for ( int i = N - 1; i >= 1; i-- )
    {
        int st = A[i];
        int dr = B[i];
        int color = C[i];
        int poz;

        if ( st > dr )
        {
            st ^= dr;
            dr ^= st;
            st ^= dr;
        }

        for ( poz = st; poz <= dr; )
        {
            while( Next[poz] != poz && poz <= dr )
                    poz = Next[poz];

            if ( poz > dr ) continue;

            answer[poz] = color;
            Next[poz] = dr + 1;
            poz++;
        }
    }
}

void print()
{
    ofstream g("curcubeu.out");

    for ( int i = 1; i < N; ++i )
            g << answer[i] << "\n";

    g.close();
}

int main()
{
    read();
    gen();
    solve();
    print();

    return 0;
}