Cod sursa(job #26007)

Utilizator astronomyAirinei Adrian astronomy Data 4 martie 2007 17:49:37
Problema Buline Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>

#define INF (-1)*2000000001
#define MAXN (1 << 18)

int N, A[MAXN], best[MAXN], Pos[MAXN], sum, S, P, L;

void solve(void)
{
    int i, t, r, ind;

    S = INF;
    
    for(i = N; i >= 1; i--)
    {
        if(A[i] >= A[i]+best[i+1])
            best[i] = A[i], Pos[i] = i;
        else
            best[i] = A[i]+best[i+1], Pos[i] = Pos[i+1];
    }

    for(i = 1; i <= N; i++)
     if(best[i] > S)
        S = best[i], P = i, L = Pos[i]-i+1;

    for(i = 1; i <= N; i++)
        sum += A[i];

    for(ind = 1, r = t = 0, i = 2; i < N; i++)
    {
        if(sum > S)
            S = sum, P = i, L = N+1-i+ind;
        sum -= A[i];
        t += A[i];
        if(t > r)
            sum = sum-r+t, r = t, ind = i;
    }
}

void read_data(void)
{
    int i, j, k;

    scanf("%d\n", &N);

    for(i = 1; i <= N; i++)
    {
        scanf("%d %d\n", &j, &k), A[i] = j;
        if(k == 0)
            A[i] *= (-1);
    }
}

void write_data(void)
{
    printf("%d %d %d\n", S, P, L);
}

int main(void)
{
    freopen("buline.in", "rt", stdin);
    freopen("buline.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}