Cod sursa(job #148828)

Utilizator cos_minBondane Cosmin cos_min Data 4 martie 2008 21:24:19
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <stdio.h>
#include <fstream>
using namespace std;

#define in "sequencequery.in"
#define out "sequencequery.out"
#define dim 100001
#define st (nod<<1)
#define dr (st+1) 

inline int Maxim(int a, int b) {
       if ( a > b ) return a;
       return b;
}

int N, M;
int C[dim];
int St[3*dim], Dr[3*dim], Sum[3*dim], V[3*dim];

int A, B;
int S, maxim;

void Update(int,int,int);
void Query(int,int,int);

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d%d", &N, &M);
    for ( int i = 1; i <= N; i++ ) 
    {
        scanf("%d", &C[i]);
        A = i;
        Update(1,1,N);
    }
    
    for ( ; M; M-- )
    {
        scanf("%d%d", &A, &B);
        S = maxim = -dim;
        Query(1,1,N);
        
        printf("%d\n", maxim);
    }
}

void Update(int nod, int left, int right)
{
     if ( left == right )
     {
          St[nod] = Dr[nod] = Sum[nod] = V[nod] = C[left];
          return;
     }
     
     int div = (left+right)>>1;
     if ( A <= div ) Update(2*nod,left,div);
     else            Update(2*nod+1,div+1,right);
     
     St[nod] = Maxim( St[st], Sum[st]+St[dr] );
     Dr[nod] = Maxim( Dr[dr], Sum[dr]+Dr[st] );
     V[nod] = Maxim( St[st]+Dr[dr], Maxim(V[st],V[dr]) );
     Sum[nod] = Sum[st] + Sum[dr];
}

void Query(int nod, int left, int right)
{
     if ( A <= left && right <= B )
     {
          S = Maxim(0,S);
          maxim = Maxim( maxim, Maxim(S+St[nod],V[nod]) );
          S = Maxim( Sum[nod]+S, Dr[nod] );
          
          return;
     }
     
     int div = (left+right)>>1;
     if ( A <= div ) Query(2*nod,left,div);
     if ( B > div )  Query(2*nod+1,div+1,right);
}