Cod sursa(job #2984171)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 23 februarie 2023 17:56:23
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#define dim 100000
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

int v[dim+1];
struct node{
    long long s, sfx, pfx, smax;
}tree[4*dim+1];

node update_nod(node st, node dr)
{
    node crt;
    crt.s=st.s+dr.s;
    crt.pfx=max(st.pfx, st.s+dr.pfx);
    crt.sfx=max(dr.sfx, dr.s+st.sfx);
    crt.smax=max(st.sfx+dr.pfx, max(st.smax, dr.smax));
    return crt;
}

void build(int nod, int st, int dr)
{
    if(st==dr)
    {
        tree[nod]={v[st], v[st], v[st], v[st]};
    }
    else
    {
        int mid=(st+dr)/2;
        build(2*nod, st, mid);
        build(2*nod+1, mid+1, dr);
        tree[nod]=update_nod(tree[2*nod], tree[2*nod+1]);
    }
}

node query(int nod, int st, int dr, int ql, int qr)
{
    if(ql<=st&&dr<=qr)
    {
        return tree[nod];
    }
    else
    {
        int mid=(st+dr)/2;
        if(qr<=mid)
        {
            return query(2*nod, st, mid, ql, qr);
        }
        if(mid<ql)
        {
            return query(2*nod+1, mid+1, dr, ql, qr);
        }
        node left, right;
        left=query(2*nod, st, mid, ql, qr);
        right=query(2*nod+1, mid+1, dr, ql, qr);
        return update_nod(left, right);
    }
}

int main()
{
    int x, y, n, m, i;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    build(1, 1, n);
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<query(1, 1, n, x, y).smax<<"\n";
    }
}