Cod sursa(job #3236342)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 28 iunie 2024 03:31:30
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <climits>
#define int long long
#define nmx 100005
using namespace std;
int n,pz,q,nr,p,arb[4*nmx],starb[4*nmx],drarb[4*nmx],v[nmx],sum[4*nmx];
void build(int st,int dr,int index)
{
    if (st==dr)
    {
        sum[index]=arb[index]=starb[index]=drarb[index]=v[st];
        return;
    }
    int mid=(st+dr)/2;
    build(st,mid,index*2);
    build(mid+1,dr,index*2+1);
    sum[index]=sum[index*2]+sum[index*2+1];
    starb[index]=max(starb[index*2],sum[index*2]+starb[index*2+1]);
    drarb[index]=max(drarb[index*2+1],drarb[index*2]+sum[index*2+1]);
    arb[index]=max(starb[index],max(drarb[index],max(starb[index*2+1]+drarb[index*2],max(arb[index*2],arb[index*2+1]))));
}
void show(int st,int dr,int index)
{
    cout<<starb[index]<<' '<<drarb[index]<<' '<<arb[index]<<' '<<sum[index]<<' '<<st<<' '<<dr<<'\n';
    if (st==dr)
        return;
    int mid=(st+dr)/2;
    show(st,mid,index*2);
    show(mid+1,dr,index*2+1);
}
struct edge
{
    int ar,st,dr,sum;
};
edge query(int st,int dr,int a,int b,int index)
{
    if (a<=st && dr<=b)
        return {arb[index],starb[index],drarb[index],sum[index]};
    int mid=(st+dr)/2;
    if (a<=mid && mid<b)
    {
        edge c=query(st,mid,a,b,index*2);
        edge d=query(mid+1,dr,a,b,index*2+1);
        edge e;
        e.sum=c.sum+d.sum;
        e.st=max(c.st,c.sum+d.st);
        e.dr=max(d.dr,d.sum+c.dr);
        e.ar=max(e.st,max(max(e.dr,c.dr+d.st),max(c.ar,d.ar)));
        return e;
    }
    else if (a<=mid)
        return query(st,mid,a,b,index*2);
    else if (mid<a)
        return query(mid+1,dr,a,b,index*2+1);
}
int32_t main()
{
    ifstream f ("sequencequery.in");
    ofstream g ("sequencequery.out");
    f>>n>>q;
    for (int i=1; i<=n; i++)
        f>>v[i];
    build(1,n,1);
    //show(1,n,1);
    for (int i=1; i<=q; i++)
    {
        int a,b;
        f>>a>>b;
        edge c=query(1,n,a,b,1);
        g<<c.ar<<'\n';
    }
}