Cod sursa(job #2068429)

Utilizator geralt_of_riviajohn nathalis geralt_of_rivia Data 17 noiembrie 2017 20:50:10
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("sequencequery.in");
ofstream cout ("sequencequery.out");
int a[300100],b[300100],c[300100],d[300100],n,m,val,poz,e,f,maxim,sum,last;
void up_date (int st,int dr,int nod)
{
    if(st==poz && dr==poz) a[nod]=b[nod]=d[nod]=c[nod]=val;
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij) up_date(st,mij,nod*2);
        else up_date(mij+1,dr,nod*2+1);
        d[nod]=d[nod*2]+d[nod*2+1];
        a[nod]=max(a[nod*2],d[nod*2]+a[nod*2+1]);
        a[nod]=max(a[nod],d[nod]);
        b[nod]=max(b[nod*2+1],d[nod*2+1]+b[nod*2]);
        b[nod]=max(b[nod],d[nod]);
        c[nod]=max(c[nod*2],c[nod*2+1]);
        c[nod]=max(c[nod],a[nod]);
        c[nod]=max(c[nod],b[nod]);
        c[nod]=max(c[nod],b[nod*2]+a[nod*2+1]);
    }
}
void ask_me (int st,int dr,int nod)
{
    if(e<=st && dr<=f)
    {
        maxim=max(maxim,c[nod]);
        maxim=max(maxim,sum+a[nod]);
        sum=max(sum+d[nod],b[nod]);
    }
    else
    {
        int mij=(st+dr)/2;
        if(e<=mij) ask_me(st,mij,nod*2);
        if(f>mij) ask_me(mij+1,dr,nod*2+1);
    }
}
void read ()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>val; poz=i;
        up_date(1,n,1);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>e>>f; sum=0;
        maxim=-INT_MAX;
        ask_me(1,n,1);
        cout<<maxim<<"\n";
    }
}
int main()
{
    read();
    cin.close();
    cout.close();
    return 0;
}