Cod sursa(job #62826)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 24 mai 2007 11:42:57
Problema SequenceQuery Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#define NMAX (1<<18)
#define MAX(a,b) (((a)>(b)) ? (a):(b))

int V[NMAX], N, M, P1, P2;
long long SumT[NMAX<<1], SumSt[NMAX<<1], SumDr[NMAX<<1], SumMax[NMAX<<1];
long long Max, S, INF;

void update(int x, int val)
{
        int nod = NMAX+x, l, r;

        SumSt[nod] = SumDr[nod] = SumMax[nod] = SumT[nod] = val;

        while (nod>1) {
              nod = nod>>1;
              l = nod<<1; r = l+1;
              SumSt[nod] = MAX(SumSt[l], SumT[l]+SumSt[r]);
              SumDr[nod] = MAX(SumDr[r], SumT[r]+SumDr[l]);
              SumMax[nod] = MAX( MAX(SumMax[l], SumMax[r]), SumSt[r]+SumDr[l]);
              SumT[nod] = SumT[l]+SumT[r];
        }
}

void query(int p1, int p2, int nod)
{
        int mij, l, r;

        if (p1>p2) return;

        if (P1 <= p1 && p2 <= P2)
        {
                if (S<0) S = 0;
                Max = MAX(Max, MAX(S+SumSt[nod], SumMax[nod]));
                S = MAX(S+SumT[nod], SumDr[nod]);
                return;
        }
        if ( (p1 <= P1 && P1 <= p2) || (p1 <= P2 && P2 <= p2) )
        {
                mij = (p1+p2)>>1; l = nod<<1; r = l+1;
                query(p1, mij, l);
                query(mij+1, p2, r);
        }
}

int main()
{
        int i, j, k, t;
        long long a = (1<<30), b = (1<<30);

        INF = a*b*4;

        freopen("sequencequery.in", "r", stdin);
        freopen("sequencequery.out", "w", stdout);

        scanf("%d %d", &N, &M);
        for (i = 1; i <= N; i++) scanf("%d", V+i);

        for (i = 1; i <= N; i++) update(i, V[i]);

        for (k = 1; k <= M; k++)
        {
                scanf("%d %d", &i, &j);
                Max = -INF; S = 0;
                if (i<=j)
                   P1 = i, P2 = j;
                else P1 = j, P2 = i;
                query(0, NMAX-1, 1);
                printf("%lld\n", Max);
        }

        return 0;
        
}