#define ls p<<1
#define rs p<<1|1
struct Seg
{
int p,l,r;
ll sum,tag,mx;
#define l(i) t[i].l
#define r(i) t[i].r
#define mx(i) t[i].mx
#define tag(i) t[i].tag
#define sum(i) t[i].sum
}t[N<<2];
void pushup(int p)
{
sum(p)=sum(ls)+sum(rs);
mx(p)=max(mx(ls),mx(rs));
}
void pushdown(int p)
{
if(tag(p))
{
sum(ls)+=tag(p)*(r(ls)-l(ls)+1);
sum(rs)+=tag(p)*(r(rs)-l(rs)+1);
mx(ls)+=tag(p);mx(rs)+=tag(p);
tag(ls)+=tag(p);
tag(rs)+=tag(p);
tag(p)=0;
}
}
void build(int p,int l,int r)
{
l(p)=l;r(p)=r;
if(l==r)
{
mx(p)=sum(p)=a[l];
return;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
}
void update(int p,int l,int r,ll d)
{
if(l<=l(p)&&r>=r(p))
{
sum(p)+=d*(r(p)-l(p)+1);
mx(p)+=d;
tag(p)+=d;
return;
}
pushdown(p);
int mid=(l(p)+r(p))>>1;
if(l<=mid) update(ls,l,r,d);
if(r>mid) update(rs,l,r,d);
pushup(p);
}
void change(int p,int x,ll d)
{
if(l(p)==r(p))
{
mx(p)+=d;sum(p)+=d;
return;
}
pushdown(p);
int mid=(l(p)+r(p))>>1;
if(x<=mid) change(ls,x,d);
else change(rs,x,d);
pushup(p);
}
ll query(int p,int l,int r)
{
if(l<=l(p)&&r>=r(p)) return sum(p);
pushdown(p);
int mid=l(p)+r(p)>>1;
ll ans=0;
if(l<=mid) ans+=query(ls,l,r);
if(r>mid) ans+=query(rs,l,r);
return ans;
}
ll ask(int p,int l,int r)
{
if(l<=l(p)&&r>=r(p)) return mx(p);
pushdown(p);
int mid=l(p)+r(p)>>1;
ll ans=-0x3f3f3f3f3f3f3f3f;
if(l<=mid) ans=max(ans,ask(ls,l,r));
if(r>mid) ans=max(ans,ask(rs,l,r));
return ans;
}