Cod sursa(job #3288146)

Utilizator nistor_dora_valentinaNistor Dora Valentina nistor_dora_valentina Data 20 martie 2025 18:24:48
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#define int long long
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int n, m, i, j, ans, x, y, v[100005];
struct arb
{
    int sum, pref, suf, maxi;
}a[400005];
void build(int nod, int st, int dr)
{
    if(st==dr)
        a[nod].sum=a[nod].pref=a[nod].suf=a[nod].maxi=v[st];
    else
    {
        int mij=(st+dr)/2;
        build(2*nod, st, mij);
        build(2*nod+1, mij+1, dr);
        a[nod].sum=a[2*nod].sum+a[2*nod+1].sum;
        a[nod].pref=max(a[nod].pref, max(a[2*nod].pref, a[2*nod].sum+a[2*nod+1].pref));
        a[nod].suf=max(a[nod].suf, max(a[2*nod+1].suf, a[2*nod].suf+a[2*nod+1].sum));
        a[nod].maxi=max(a[nod].maxi, max(a[2*nod].sum, max(a[2*nod+1].sum, a[2*nod].suf+a[2*nod+1].pref)));
    }
}
void query(int nod, int st, int dr, int l, int r)
{
    if(l<=st && dr<=r)
        ans=max(ans, a[nod].maxi);
    else
    {
        int mij=(st+dr)/2;
        if(l<=mij)
            query(2*nod, st, mij, l, r);
        if(r>mij)
            query(2*nod+1, mij+1, dr, l, r);
    }
}
signed main()
{
    fin>>n>>m;
    for(i=1; i<=n; i++)
        fin>>v[i];
    build(1, 1, n);
    while(m--)
    {
        fin>>x>>y;
        ans=-1e9;
        query(1, 1, n, x, y);
        fout<<ans<<'\n';
    }
    return 0;
}