Cod sursa(job #92181)

Utilizator filipbFilip Cristian Buruiana filipb Data 14 octombrie 2007 12:44:33
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <stdio.h>

#define maxim(a, b) ((a > b) ? a : b)
#define minim(a, b) ((a < b) ? a : b)
#define ll long long
#define NMax 1000005

int N, A[NMax], B[NMax], C[NMax], next[NMax], tata[NMax], rang[NMax];
int color[NMax];

int find_multime(int x)
{
    if (x != tata[x])
        tata[x] = find_multime(tata[x]);
    return tata[x];
}

void uneste(int x, int y, int tip)
{
    if (rang[x] < rang[y])
        tata[x] = y, next[y] = maxim(next[x], next[y]) + tip;
    else
    {
        tata[y] = x;
        next[x] = maxim(next[x], next[y]) + tip;
        rang[x] += (rang[x] == rang[y]);
    }
}

int main(void)
{
    int i, j, aux, i1, i2;
    
    freopen("curcubeu.in", "r", stdin);
    freopen("curcubeu.out", "w", stdout);

    scanf("%d %d %d %d", &N, &A[1], &B[1], &C[1]);
    for (i = 2; i < N; i++)
        A[i] = ((ll)A[i-1] * i) % N,
        B[i] = ((ll)B[i-1] * i) % N,
        C[i] = ((ll)C[i-1] * i) % N;

    for (i = 1; i < N; i++)
        if (A[i] > B[i])
            aux = A[i], A[i] = B[i], B[i] = aux;

    for (i = 1; i < N; i++)
        printf("%d %d %d\n", A[i], B[i], C[i]);

    for (i = 1; i <= N; i++) next[i] = i, tata[i] = i, rang[i] = 1;

    next[N] = N;
    for (i = N-1; i; i--)
    {
        i1 = find_multime(A[i]);
        if (color[A[i]-1])
            uneste(i1, find_multime(A[i]-1), +0);
        
        for (j = next[i1]; j <= B[i]; j = next[find_multime(j+1)])
        {
             color[j] = C[i];
             if (A[i] != j)
             {
                i1 = find_multime(A[i]);
                uneste(i1, j, +1);
             }
             if (j + 1 <= B[i] && next[find_multime(j+1)] != j+1)
             {
                i1 = find_multime(A[i]);
                i2 = find_multime(j+1);
                uneste(i1, i2, +0);
             }             
        }
        
    }

    for (i = 1; i < N; i++)
        printf("%d\n", color[i]);

    return 0;
}