Pagini recente » Cod sursa (job #710397) | Cod sursa (job #2828835) | Cod sursa (job #2517981) | Cod sursa (job #2755810) | Cod sursa (job #2579392)
#include<fstream>
#define inf 2000000000
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int s[300000],st[300000],dr[300000],smax[300000],v[100001];
int n,m,a,b,sol,sum;
void build(int nod, int x, int y)
{
if(x==y)
{
s[nod]=st[nod]=dr[nod]=smax[nod]=v[x];
return;
}
int mid=(x+y)/2;
build(2*nod,x,mid);
build(2*nod+1,mid+1,y);
s[nod]=s[2*nod]+s[2*nod+1];///suma totala
st[nod]=max(st[2*nod],s[2*nod]+st[2*nod+1]);///suma la stanga
dr[nod]=max(dr[2*nod+1],s[2*nod+1]+dr[2*nod]);///suma la dreapta
smax[nod]=max(smax[2*nod],smax[2*nod+1]);///suma maxima
smax[nod]=max(smax[nod],st[2*nod+1]+dr[2*nod]);
}
void query(int nod, int x, int y)
{
if(a<=x&&y<=b)
{
sol=max(sol,max(smax[nod],sum+st[nod]));
sum=max(sum+s[nod],dr[nod]);///partea dreapta
return;
}
int mid=(x+y)/2;
if(a<=mid)
query(2*nod,x,mid);
if(b>mid)
query(2*nod+1,mid+1,y);
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>v[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
fin>>a>>b;
sol=-inf,sum=-inf;
query(1,1,n);
fout<<sol<<' ';
}
return 0;
}