Pagini recente » Cod sursa (job #956375) | Cod sursa (job #1818133) | Cod sursa (job #1289488) | Cod sursa (job #441318) | Cod sursa (job #876968)
Cod sursa(job #876968)
#include<fstream>
#define N 400100
#define ll long long
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
long long n,i,start,finish,m,p,v;
long long maxi,sum,a[N],b[N],c[N],s[N];
void update(int nod,int st,int dr)
{
if(st==dr)
{
s[nod]=v;
a[nod]=v;
b[nod]=v;
c[nod]=v;
return ;
}
int mij=(st+dr)>>1;
if(p<=mij)
{
update(2*nod,st,mij);
}
else
{
update(2*nod+1,mij+1,dr);
}
s[nod]=s[nod*2]+s[2*nod+1];
a[nod]=max(a[2*nod],s[2*nod]+a[2*nod+1]);
b[nod]=max(b[2*nod+1],s[2*nod+1]+b[2*nod]);
c[nod]=max(max(c[nod*2],c[nod*2+1]),a[2*nod+1]+b[2*nod]);
}
void query(int nod,int st,int dr)
{
if(start<=st&&dr<=finish)
{
int t=max(a[nod]+sum,c[nod]);
maxi=max((ll)t,maxi);
sum=max(sum+s[nod],b[nod]);
return ;
}
int mij=(st+dr)>>1;
if(start<=mij)
query(2*nod,st,mij);
if(finish>mij)
query(2*nod+1,mij+1,dr);
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
{
s[i]=a[i]=b[i]=c[i]=-(1LL<<60);
}
for(i=1;i<=n;++i)
{
f>>v;
p=i;
update(1,1,n);
}
for(i=1;i<=m;++i)
{
f>>start>>finish;
maxi=-(1LL<<60);
sum=0;
query(1,1,n);
g<<maxi<<'\n';
}
return 0;
}