Pagini recente » Cod sursa (job #163453) | Cod sursa (job #3185542) | Cod sursa (job #1945172) | Cod sursa (job #2047086) | Cod sursa (job #3221960)
#include <bits/stdc++.h>
#define MAX 100005
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int v[MAX];
struct str
{
long long sum;
long long inc;
long long fin;
long long best;
}aint[4*MAX];
void build(int nod,int st,int dr)
{
if(st==dr)
aint[nod]={v[st],v[st],v[st],v[st]};
else
{
int mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
aint[nod].sum=aint[2*nod].sum+aint[2*nod+1].sum;
aint[nod].inc=max(aint[2*nod].inc,aint[2*nod].sum+aint[2*nod+1].inc);
aint[nod].fin=max(aint[2*nod+1].fin,aint[2*nod].fin+aint[2*nod+1].sum);
aint[nod].best=max(max(aint[2*nod].best,aint[2*nod+1].best),aint[2*nod].fin+aint[2*nod+1].inc);
}
}
long long rasp;
long long sircrt;
void query(int nod,int st,int dr,int a,int b)
{
if(a<=st && dr<=b)
{
rasp=max(rasp,aint[nod].best);
rasp=max(rasp,sircrt+aint[nod].inc);
sircrt=max(sircrt+aint[nod].sum,aint[nod].fin);
}
else
{
int mij=(st+dr)/2;
if(a<=mij)
query(2*nod,st,mij,a,b);
if(b>mij)
query(2*nod+1,mij+1,dr,a,b);
}
}
int main()
{
int n,m;
fin>>n>>m;
int i;
for(i=1;i<=n;++i)
fin>>v[i];
build(1,1,n);
while(m--)
{
int x,y;
fin>>x>>y;
rasp=-1e18;
sircrt=-1e18;
query(1,1,n,x,y);
fout<<rasp<<'\n';
}
return 0;
}