Cod sursa(job #1434420)

Utilizator GinguIonutGinguIonut GinguIonut Data 10 mai 2015 16:46:20
Problema SequenceQuery Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#define INF 1 << 30
#define dim 100001
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int pozst,pozdr,i,n,m,val[dim];
long long arb[dim*3],A[dim],B[dim],M[dim],Sum[dim],ans,Suma;
void build(int nod, int st, int dr)
{
    if(st==dr)
    {
        arb[nod]=A[nod]=B[nod]=M[nod]=Sum[nod]=val[st];
        return;
    }
    int mijl=st+(dr-st)/2;
    build(2*nod,st,mijl);
    build(2*nod+1,mijl+1,dr);

    Sum[nod]=Sum[nod*2]+Sum[2*nod+1];
    A[nod]=max(A[2*nod],A[2*nod+1]+Sum[2*nod]);
    B[nod]=max(B[2*nod]+Sum[2*nod+1],B[2*nod+1]);
    M[nod]=max(M[2*nod],max(M[2*nod+1],B[2*nod]+A[2*nod+1]));
}
void query(int nod, int st, int dr)
{
    if(st>=pozst&&dr<=pozdr)
    {
        if(Suma<0)
            Suma=0;
        ans=max(ans,max(Suma+A[nod],M[nod]));
        Suma=max(Suma+Sum[nod],B[nod]);
        return;
    }
    int mijl=st+(dr-st)/2;
    if(pozst<=mijl)
        query(2*nod,st,mijl);
    if(pozdr>mijl)
        query(2*nod+1,mijl+1,dr);
}
int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>val[i];
    build(1,1,n);
    for(i=1;i<=m;i++)
    {
        Suma=0;
        ans = -INF;
        fin>>pozst>>pozdr;
        query(1,1,n);
        fout<<ans<<'\n';
    }
    return 0;
}