Cod sursa(job #3132740)

Utilizator solicasolica solica solica Data 23 mai 2023 18:55:21
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>

using namespace std;

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

#define int long long int
#define NMAX 100008

struct nod
{
    int pref,suf,suma,maxi;
};

int n,q,i,j,x,y;
int a[NMAX];
nod tree[NMAX*4];

nod update_node(nod stanga, nod dreapta)
{
    nod current;
    current.suma=stanga.suma+dreapta.suma;
    current.pref=max(stanga.pref,stanga.suma+dreapta.pref);
    current.suf=max(dreapta.suf,dreapta.suma+stanga.suf);
    current.maxi=max(stanga.suf+dreapta.pref,max(stanga.maxi,dreapta.maxi));
    return current;
}

void build (int node, int st, int dr)
{
    if (st==dr)
    {
        tree[node].maxi=tree[node].pref=tree[node].suf=tree[node].suma=a[st];
    }
    else
    {
        int mij=(st+dr)/2;
        build (node*2,st,mij);
        build (node*2+1,mij+1,dr);
        tree[node]=update_node(tree[node*2],tree[node*2+1]);
    }

}

nod query (int node, int st, int dr, int l, int r)
{
    if (l<=st && dr<=r)
    {
        return tree[node];
    }
    else
    {
        int mij=(st+dr)/2;
        if (r<=mij)
        {
            return query(node*2,st,mij,l,r);
        }
        if (l>mij)
        {
            return query(node*2+1,mij+1,dr,l,r);
        }
        nod stanga=query(node*2,st,mij,l,r),dreapta=query(node*2+1,mij+1,dr,l,r);
        return update_node(stanga,dreapta);
    }
}

signed main()
{
    fin>>n>>q;
    for (i=1; i<=n; i++)
    {
        fin>>a[i];
    }
    build (1,1,n);
    for (i=1; i<=q; i++)
    {
        fin>>x>>y;
        fout<<query(1,1,n,x,y).maxi
        <<'\n';
    }
    return 0;
}