Cod sursa(job #2412784)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 22 aprilie 2019 15:47:24
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#define Dim 100008
#define Min -10000000009
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
long long N,M,V[Dim],TS[2*Dim],TD[2*Dim],TB[2*Dim],TSUM[2*Dim];
long long a,b,ans,add,AUX[2*Dim];

void Build(int nod,int st,int dr)
{
    if(st==dr)
    {
        TS[nod]=TD[nod]=TSUM[nod]=TB[nod]=V[st];
        return;
    }
    int mij=(st+dr)/2;
    Build(2*nod,st,mij);
    Build(2*nod+1,mij+1,dr);
    int rs=2*nod,rd=rs+1;
    TS[nod]=max(TS[rs],TS[rd]+TSUM[rs]);
    TD[nod]=max(TD[rd],TSUM[rd]+TD[rs]);
    TB[nod]=max(TB[rs],max(TB[rd],TD[rs]+TS[rd]));
    TSUM[nod]=TSUM[rs]+TSUM[rd];
}

int  query(int nod,int st,int dr)
{
    if(st>=a&&dr<=b)
    {
        ans=max(ans,TB[nod]);
        return nod;
    }
    int mij=(st+dr)/2,A,B;
    bool decia=0,decib=0;
    if(a<=mij)
    {
        A=query(2*nod,st,mij);
        decia=1;
    }
    if(b>=mij+1)
    {
        B=query(2*nod+1,mij+1,dr);
        decib=1;
    }
    if(decia==1&&decib==0)
    {
        ans=max(ans,TB[A]);
        return A;
    }
    else
    if(decia==0&&decib==1)
    {
        ans=max(ans,TB[B]);
        return B;
    }
    else
    if(decia==1&&decib==1)
    {
        long long aux=max(TB[A],max(TB[B],TD[A]+TS[B]));
        ans=max(ans,aux);
        return nod;
    }
    return 0;

}

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++) f>>V[i];
    Build(1,1,N);
    TB[0]=TS[0]=TD[0]=Min;
    for(int i=1;i<=M;i++)
    {
        f>>a>>b;
        ans=Min;
        query(1,1,N);
        g<<ans<<'\n';
    }
    return 0;
}