Cod sursa(job #197507)

Utilizator filipbFilip Cristian Buruiana filipb Data 4 iulie 2008 15:52:21
Problema Reconst Scor Ascuns
Compilator cpp Status done
Runda Marime 1.45 kb
#include <stdio.h>
#include <string.h>

int N, M, start[2048], End[2048], sum[2048], poz[2048];
long long S[2048];

int main(void)
{
    int i, j, k;
    int ok = 0;
    
    freopen("reconst.in", "r", stdin);
    freopen("reconst.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for (i = 1; i <= M; ++i)
        scanf("%d %d %d", &start[i], &End[i], &sum[i]);

    for (; !ok; )
    {
        memset(poz, 0, sizeof(poz));
        
        for (i = 1; i <= M; ++i)
            if (!poz[End[i]])
                poz[End[i]] = i;
                
        for (i = 1, ok = 1; i <= N; ++i)
            if (poz[End[i]] && poz[End[i]] != i)
            {
                ok = 0;
                k = poz[End[i]];
                if (start[k] > start[i])
                    End[i] = start[k]-1,
                    sum[i] = sum[i]-sum[k];
                else
                    End[k] = start[i]-1,
                    sum[k] = sum[k]-sum[i],
                    poz[k] = 0;
            }
    }

    for (i = 1; i <= N; ++i)
    {
        for (j = 1, ok = 0; j <= M; ++j)
            if (End[j] == i)
            {
                ok = 1;
                S[i] = S[i-1] + (sum[j] - S[i-1] + S[start[j]-1]);
                break;
            }
            
        if (!ok)
            S[i] = S[i-1];
    }

    for (i = 1; i <= N; ++i)
        printf("%d ", (int)(S[i]-S[i-1]));
    printf("\n");
    
    return 0;
}