#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
struct segtree{
struct node {
int l,r;
int sum,mn,mx;
int tag;
};
int n;
const int inf=1e9;
vector<int> a;
vector<node> t;
segtree(int x){
n=x;
a.resize(n+1);
t.resize((n+1)<<2);
build(1,1,n);
}
segtree(int x,vector<int> &v){
n=x;
a=v;
t.resize((n+1)<<2);
build(1,1,n);
}
void push_up(int p){
t[p].sum=t[ls(p)].sum+t[rs(p)].sum;
t[p].mn=min(t[ls(p)].mn,t[rs(p)].mn);
t[p].mx=max(t[ls(p)].mx,t[rs(p)].mx);
}
void build(int p,int l,int r){
if(l==r){
t[p]={l,r,a[l],a[l],a[l],0};
return;
}
t[p]={l,r};
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void addtag(int p,int d){
t[p].tag+=d;
t[p].sum+=(t[p].r-t[p].l+1)*d;
t[p].mn+=d;
t[p].mx+=d;
}
void push_down(int p){
if(t[p].tag){
addtag(ls(p),t[p].tag);
addtag(rs(p),t[p].tag);
t[p].tag=0;
}
}
void update(int l,int r,int p,int d){
if(l<=t[p].l&&t[p].r<=r){
addtag(p,d);
return;
}
push_down(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) update(l,r,ls(p),d);
if(mid<r) update(l,r,rs(p),d);
push_up(p);
}
ll query_sum(int l,int r,int p){
if(l<=t[p].l&&t[p].r<=r){
return t[p].sum;
}
push_down(p);
int ans=0;
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) ans+=query_sum(l,r,ls(p));
if(mid<r) ans+=query_sum(l,r,rs(p));
return ans;
}
ll query_mn(int l,int r,int p){
if(l<=t[p].l&&t[p].r<=r){
return t[p].mn;
}
push_down(p);
ll ans=inf;
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) ans=min(ans,query_mn(l,r,ls(p)));
if(mid<r) ans=min(ans,query_mn(l,r,rs(p)));
return ans;
}
ll query_mx(int l,int r,int p){
if(l<=t[p].l&&t[p].r<=r){
return t[p].mx;
}
push_down(p);
ll ans=-inf;
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) ans=max(ans,query_mx(l,r,ls(p)));
if(mid<r) ans=max(ans,query_mx(l,r,rs(p)));
return ans;
}
};