Cod sursa(job #2391078)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 28 martie 2019 17:28:36
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("sequencequery.in");
ofstream out("sequencequery.out");
int l[200002],r[200002],a[200002],b[200002],s[200002],l1,r1,mx;
int stanga(int l2,int r2,int nr)
{
    if(l2>r2||l2>r1||r2<l1)
        return 0;
    int m=(l2+r2)/2;
    if(r1>=m)
    {
        mx=max(mx,a[nr]);
        return l[nr];
    }
    return stanga(l2,m,nr*2);
}
int dreapta(int l2,int r2,int nr)
{
    if(l2>r2||l2>r1||r2<l1)
        return 0;
    int 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(int l2,int r2,int nr)
{
    if(l1<=l2&&r2<=r1)
    {
        mx=max(mx,a[nr]);
        return;
    }
    int 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(int l2,int r2,int nr)
{
    if(l2>r2)
        return;
    if(l2==r2)
    {
        l[nr]=r[nr]=a[nr]=b[l2];
        return;
    }
    int 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()	
{
    int n,q,nr,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;	
}