Cod sursa(job #1278685)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 29 noiembrie 2014 11:01:59
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
/// Craciun Catalin
///  Curcubeu
#include <iostream>
#include <fstream>

#define ll long long
#define NMax 1000005
#define make_muchie muchie

struct muchie {

    ll first, last;
    ll culoare;
    muchie() {
        first = last = culoare = 0;
    }
    muchie(ll a, ll b, ll c) {
        first = a;
        last = b;
        culoare = c;
    }
};

using namespace std;

ifstream f("curcubeu.in");
ofstream g("curcubeu.out");

ll n;
muchie M[NMax];
int cul[NMax];
int next[NMax];

inline int minim(int a, int b) { if (a < b) return a; return b; };
inline int maxim(int a, int b) { if (a > b) return a; return b; };

void read() {

    f>>n;
    f>>M[1].first>>M[1].last>>M[1].culoare;
    for (int i=2;i<n;i++)
        M[i] = make_muchie(minim((M[i-1].first * i) % n, (M[i-1].last * i) % n),
                           maxim((M[i-1].first * i) % n, (M[i-1].last * i) % n),
                           (M[i-1].culoare * i) % n);
    n--;
}

int main() {

    read();
    for (int i=n;i>=1;i--) {
        int left = M[i].first;
        int right = M[i].last;

        while (left <= right) {
            if (next[left] != 0) {
                int aux = next[left];
                next[left] = maxim(next[left], right+1);
                left = aux;
            } else {
                cul[left] = M[i].culoare;
                next[left] = right+1;
                left++;
            }
        }
    }

    for (int i=1;i<=n;i++)
        g<<cul[i]<<'\n';

    f.close(); g.close();
    return 0;
}