Cod sursa(job #3306243)

Utilizator iordacheMatei Iordache iordache Data 8 august 2025 17:50:09
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>
#define pb push_back
#define int long long
using namespace std;
const int N=1e5+5;
int v[N];
struct Node
{
    int ss,pref,suf,mx;
};
Node aint[4*N];
void reset(int node, int l)
{
    aint[node].ss=aint[node].pref=aint[node].suf=aint[node].mx=v[l];
}
void combine(Node &c, Node a, Node b)
{
    c.ss=a.ss+b.ss;
    c.pref=max(a.pref,a.ss+b.pref);
    c.suf=max(b.suf,a.suf+b.ss);
    c.mx=max({a.mx,b.mx,a.suf+b.pref});
}
void build(int node, int l, int r)
{
    if(l==r) {reset(node,l);return;}
    int mij=(l+r)/2;
    build(node*2,l,mij);
    build(node*2+1,mij+1,r);
    combine(aint[node],aint[node*2],aint[node*2+1]);
}
Node ans;
void query(int node, int l, int r, int ql, int qr)
{
    if(qr<l||r<ql) return;
    if(ql<=l&&r<=qr) {combine(ans,ans,aint[node]);return;}
    int mij=(l+r)/2;
    query(node*2,l,mij,ql,qr);
    query(node*2+1,mij+1,r,ql,qr);
}
signed main()
{
    ifstream cin("sequencequery.in");ofstream cout("sequencequery.out");
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;++i) cin>>v[i];
    build(1,1,n);
    cout<<'\n';
    while(q--)
    {
        int l,r;cin>>l>>r;
        ans.ss=ans.pref=0;ans.suf=ans.mx=-1e18;
        query(1,1,n,l,r);
        cout<<ans.mx<<'\n';
    }
}