Cod sursa(job #2391086)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 28 martie 2019 17:32:51
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream in("sequencequery.in");
ofstream out("sequencequery.out");
long long l[400002],r[400002],a[400002],b[400002],s[400002],l1,r1,mx;
ll stanga(ll l2,ll r2,ll nr)
{
    if(l2>r2||l2>r1||r2<l1)
        return 0;
    ll m=(l2+r2)/2;
    if(r1>=m)
    {
        mx=max(mx,a[nr]);
        return l[nr];
    }
    return stanga(l2,m,nr*2);
}
ll dreapta(ll l2,ll r2,ll nr)
{
    if(l2>r2||l2>r1||r2<l1)
        return 0;
    ll m=(l2+r2)/2;
    if(l1<=m)
    {
        mx=max(mx,a[nr]);
        return r[nr];
    }
    return dreapta(m+1,r2,nr*2+1);
}
void querry(ll l2,ll r2,ll nr)
{
    if(l1<=l2&&r2<=r1)
    {
        mx=max(mx,a[nr]);
        return;
    }
    ll m=(l2+r2)/2;
    if(m>=l1&&m<=r1)
        mx=max(mx,stanga(m+1,r2,nr*2+1)+dreapta(l2,m,nr*2));
    else if(m>=r1)
        querry(l2,m,nr*2);
    else
        querry(m+1,r2,nr*2+1);
}
void baga(ll l2,ll r2,ll nr)
{
    if(l2>r2)
        return;
    if(l2==r2)
    {
        l[nr]=r[nr]=a[nr]=b[l2];
        return;
    }
    ll m=(l2+r2)/2;
    baga(l2,m,nr*2);
    baga(m+1,r2,nr*2+1);
    a[nr]=max(r[nr*2]+l[nr*2+1],max(a[nr*2],a[nr*2+1]));
    l[nr]=max(l[nr*2],s[m]-s[l2-1]+l[nr*2+1]);
    r[nr]=max(r[nr*2+1],s[r2]-s[m]+r[nr*2]);
}
int main()	
{
    long long n,q,i;
    in>>n>>q;
    for(i=1;i<=n;i++)
    {
        in>>b[i];
        s[i]=s[i-1]+b[i];
    }
    baga(1,n,1);
    while(q--)
    {
        in>>l1>>r1;
        mx=-(1<<29);
        querry(1,n,1);
        out<<mx<<"\n";
    }
    return 0;	
}