Cod sursa(job #3181026)

Utilizator paull122Paul Ion paull122 Data 6 decembrie 2023 12:23:07
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ll;
using namespace std;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

ll mx(ll a,ll b)
{
    return a > b ? a : b;
}
struct node
{
    ll sum,pref,suff,ans;
};

ll v[200001];
node A[500001];

node combine(node l,node r)
{
    node res;
    res.sum=l.sum+r.sum;
    res.pref=mx(l.pref, l.sum+r.pref);
    res.suff=mx(r.suff, r.sum+l.suff);
    res.ans=mx(mx(l.ans, r.ans), l.suff+r.pref);
    return res;
}
void build(int i,int st,int dr)
{
    if(st==dr)
    {
        A[i]={v[st],v[st],v[st],v[st]};
    }
    else
    {
        int m = (st+dr)/2;
        build(2*i,st,m);
        build(2*i+1,m+1,dr);
        A[i]=combine(A[2*i],A[2*i+1]);
    }
}
node query(int i,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
    {
        return A[i];
    }
    else
    {
        int m = (st+dr)/2;
        node left,right;
        if(a <= m)
        {
             left=query(2*i,st,m,a,b);
        }
        if(b>m)
        {
            right=query(2*i+1,m+1,dr,a,b);
        }
        if(a<=m && b > m)
        {
            return combine(left,right);
        }
        return a<=m ? left : right;
    }
}

int main()
{
    int n,q;
    fin >> n >> q;
    for(int i=1;i<=n;i++)
    {
        fin >> v[i];
    }
    build(1,1,n);
    while(q--)
    {
        int t,a,b;
        fin >> a >> b;
        fout << query(1,1,n,a,b).ans << "\n";
    }


}