Cod sursa(job #623386)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 19 octombrie 2011 20:38:03
Problema Curcubeu Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>

#define NMax 1000005

using namespace std;

int AI[3*NMax], N, A, B, C;

inline int Max (int a, int b)
{
    if (a>b)
    {
        return a;
    }
    return b;
}

inline int Min (int a, int b)
{
    if (a<b)
    {
        return a;
    }
    return b;
}

void Build (int K, int L, int R)
{
    int Mid=(L+R)>>1;
    AI[K]=-1;
    if (L==R)
    {
        return;
    }
    Build (K<<1, L, Mid);
    Build ((K<<1)+1, Mid+1, R);
}

void Update (int K, int L, int R, int UL, int UR, int X)
{
    int Mid=(L+R)>>1;
    if (UL<=L and R<=UR)
    {
        AI[K]=X;
        return;
    }
    if (AI[K]!=-1)
    {
        Update (K<<1, L, Mid, L, Mid, AI[K]);
        Update ((K<<1)+1, Mid+1, R, Mid+1, R, AI[K]);
        AI[K]=-1;
    }
    if (UL<=Mid)
    {
        Update (K<<1, L, Mid, UL, UR, X);
    }
    if (UR>Mid)
    {
        Update ((K<<1)+1, Mid+1, R, UL, UR, X);
    }
}

int Query (int K, int L, int R, int X)
{
    int Mid=(L+R)>>1;
    if (AI[K]!=-1)
    {
        return AI[K];
    }
    if (X<=Mid)
    {
        return Query (K<<1, L, Mid, X);
    }
    else
    {
        return Query ((K<<1)+1, Mid+1, R, X);
    }
}

void Read ()
{
    ifstream fin ("curcubeu.in");
    fin >> N >> A >> B >> C;
}

void Print ()
{
    ofstream fout ("curcubeu.out");
    for (int i=1; i<N; ++i)
    {
        fout << Query (1, 1, N-1, i) << "\n";
    }
}

int main()
{
    Read ();
    Build (1, 1, N-1);
    for (int i=1; i<N; ++i)
    {
        A=(A*i)%N;
        B=(B*i)%N;
        C=(C*i)%N;
        Update (1, 1, N-1, Min (A, B), Max (A, B), C);
    }
    Print ();
    return 0;
}