Cod sursa(job #1807019)

Utilizator penetavyPene Cosmin-Octavian penetavy Data 15 noiembrie 2016 22:00:52
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <stdio.h>

#define N_MAX 1000000

using namespace std;

FILE *fin = fopen("curcubeu.in", "r");
FILE *fout = fopen("curcubeu.out", "w");

int N, A, B, C;
int mic, mare;
int colour[N_MAX + 1];
int boss[N_MAX + 1];
int jump[N_MAX + 1];

int find(int x) {
    int t;
    if(x == boss[x])
        return x;
    else {
        boss[x] = find(boss[x]);
        return find(boss[x]);
    }
}

void unify(int x, int y) {
    int i, j;
    i = find(x);
    j = find(y);
    if (i != j) {
        boss[j] = i;
        jump[i] = jump[j];
    }
}

struct anakin {
    int inc, sf, color;
};

anakin pas[N_MAX + 1];

int main(){
    int i, j;
    int t;
    int ver;

    fscanf(fin, "%d %d %d %d", &N, &A, &B, &C);


    for (t = 1; t <= N - 1; t++) {
        if (A > B) {
            mic = B;
            mare = A;
        }
        else {
            mic = A;
            mare = B;
        }

        pas[t].inc = mic;
        pas[t].sf = mare;
        pas[t].color = C;

        A = (1LL * A * (t + 1)) % N;
        B = (1LL * B * (t + 1)) % N;
        C = (1LL * C * (t + 1)) % N;
    }

    for (i = N - 1; i >= 1; i--) {
        mic = pas[i].inc;
        mare = pas[i].sf;
        C = pas[i].color;
        for (j = mic; j <= mare; j++) {
            if (boss[j] == 0) { ///daca elementul curent nu a mai fost vizitat
                boss[j] = j;
                jump[j] = j;
                if (boss[j - 1] != 0){///daca se poate uni cu elementul de sus
                    unify(j - 1, j);
                }
                printf("%d %d\n", j, C);
                colour[j] = C;
            }
            else {
                if(boss[j - 1] != 0)
                    unify(j, j - 1);
                j = jump[find(j)];
            }
        }
    }

    for (i = 1; i <= N - 1; i++)
        fprintf(fout, "%d\n", colour[i]);

    fclose(fin);
    fclose(fout);
    return 0;
}