Cod sursa(job #1264641)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 15 noiembrie 2014 23:35:00
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
int N,M;
long long Array[NMAX],Sum[4*NMAX],SumA[4*NMAX],SumB[4*NMAX],SumC[4*NMAX],DP,result;
void Build(long long Node,long long L,long long R)
{
    if(L>R)
        return;
    if(L==R)
    {
        Sum[Node]=Array[L];
        SumA[Node]=SumB[Node]=SumC[Node]=Array[L];
        return;
    }
    Build(Node*2,L,(L+R)/2);
    Build(Node*2+1,(L+R)/2+1,R);
    Sum[Node]=Sum[Node*2]+Sum[Node*2+1];
    SumA[Node]=max(SumA[Node*2],Sum[Node*2]+SumA[Node*2+1]);
    SumB[Node]=max(SumB[Node*2+1],Sum[Node*2+1]+SumB[Node*2]);
    SumC[Node]=max(SumC[Node*2],SumC[Node*2+1]);
    SumC[Node]=max(SumC[Node],SumB[Node*2]+SumA[Node*2+1]);
}
void Read()
{
    int i;
    f>>N>>M;
    for(i=1;i<=N;i++)
        f>>Array[i];
}
void Query(long long Node,long long L,long long R,long long a,long long b)
{
    if(L>R || L>b || R<a)
        return ;
    if(a<=L && R<=b)
    {
        result=max(result,SumC[Node]);
        result=max(result,SumA[Node]);
        result=max(result,DP+SumA[Node]);
        result=max(result,DP);
        DP=max(SumB[Node],DP+Sum[Node]);
        return;
    }
    Query(Node*2,L,(L+R)/2,a,b);
    Query(Node*2+1,(L+R)/2+1,R,a,b);
}
int main()
{
    Read();
    Build(1,1,N);
    for(int i=1;i<=M;i++)
    {
        int x,y;
        f>>x>>y;
        result=-1000000000000;
        DP=-1000000000000;
        Query(1,1,N,x,y);
        g<<result<<"\n";
    }
    return 0;
}