Cod sursa(job #2741630)

Utilizator levladiatorDragutoiu Vlad-Ioan levladiator Data 16 aprilie 2021 21:22:28
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pf push_front
#define ll long long
#define ull unsigned long long
#define x first
#define y second
#define pi pair<int,int>
#define pl pair<ll,ll>
#define EPSILON 0.000001
#define zeros(x) ((x^(x-1))&x)

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

const ll NMAX=1e5+5,INF=1e18,MOD=9917,MMAX=1e2+5,inf=INT_MAX;

int N,M;
int v[NMAX];

struct node
{
    int sum,pref,suf,res;
};
node aint[4*NMAX],NO;

node uneste(node a,node b)
{
    node c;
    c.sum=a.sum+b.sum;
    c.pref=max(a.pref,a.sum+b.pref);
    c.suf=max(b.suf,a.suf+b.sum);
    c.res=max(a.res,max(b.res,a.suf+b.pref));

    return c;
}

void build(int nod,int left,int right)
{
    if(left>right)return;
    if(left==right)
    {
        aint[nod].sum=v[left];
        aint[nod].pref=v[left];
        aint[nod].suf=v[left];
        aint[nod].res=v[left];
        return;
    }
    int mid=(left+right)/2;

    build(2*nod,left,mid);
    build(2*nod+1,mid+1,right);

    aint[nod]=uneste(aint[2*nod],aint[2*nod+1]);
}

node query(int nod,int left,int right,int st,int dr)
{
    if(left>dr||right<st)return NO;
    if(st<=left&&right<=dr)
    {
        return aint[nod];
    }
    int mid=(left+right)/2;
    return uneste(query(2*nod,left,mid,st,dr),query(2*nod+1,mid+1,right,st,dr));

}

int main()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
    {
        fin>>v[i];
    }
    NO.res=NO.sum=NO.pref=NO.suf=-1e9;
    build(1,1,N);
    for(int i=1;i<=M;i++)
    {
        int a,b;
        fin>>a>>b;
        fout<<query(1,1,N,a,b).res<<'\n';
    }
    return 0;
}