Pagini recente » Cod sursa (job #2815392) | Cod sursa (job #2718412) | Cod sursa (job #2988808) | Cod sursa (job #1190158) | Cod sursa (job #1434424)
#include <fstream>
#define dim 100001
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int pozst,pozdr,i,n,m,val[dim];
long long arb[dim*3],A[dim],B[dim],M[dim],Sum[dim],ans,Suma,INF;
void build(int nod, int st, int dr)
{
if(st==dr)
{
arb[nod]=A[nod]=B[nod]=M[nod]=Sum[nod]=val[st];
return;
}
int mijl=st+(dr-st)/2;
build(2*nod,st,mijl);
build(2*nod+1,mijl+1,dr);
Sum[nod]=Sum[nod*2]+Sum[2*nod+1];
A[nod]=max(A[2*nod],A[2*nod+1]+Sum[2*nod]);
B[nod]=max(B[2*nod]+Sum[2*nod+1],B[2*nod+1]);
M[nod]=max(M[2*nod],max(M[2*nod+1],B[2*nod]+A[2*nod+1]));
}
void query(int nod, int st, int dr)
{
if(st>=pozst&&dr<=pozdr)
{
if(Suma<0)
Suma=0;
ans=max(ans,max(Suma+A[nod],M[nod]));
Suma=max(Suma+Sum[nod],B[nod]);
return;
}
int mijl=st+(dr-st)/2;
if(pozst<=mijl)
query(2*nod,st,mijl);
if(pozdr>mijl)
query(2*nod+1,mijl+1,dr);
}
int main()
{
fin>>n>>m;
INF = 9223372036854775805*1ll;
for(i=1;i<=n;i++)
fin>>val[i];
build(1,1,n);
for(i=1;i<=m;i++)
{
Suma=0;
ans = -INF;
fin>>pozst>>pozdr;
query(1,1,n);
fout<<ans<<'\n';
}
return 0;
}