int a[maxn];
struct Segment_Tree
{
#define maxn 100005
#define ls o<<1
#define rs o<<1|1
#define lss ls,l,mid
#define rss rs,mid+1,r
int tr[maxn<<2];
//int lch[maxn],rch[maxn];
int add[maxn];
int sum[maxn];
inline void pushdown(int o)
{
sum[o]=sum[ls]+sum[rs];
}
inline void maintain(int o,int l,int r)
{
int mid=l+r>>1;
sum[ls]+=(mid-l+1)*add[o];
sum[rs]+=(r-mid)*add[o];
add[ls]+=add[o];
add[rs]+=add[o];
add[o]=0;
}
void build(int o,int l,int r)
{
if(l==r)
{
sum[o]=a[l];
return ;
}
int mid=l+r>>1;
build(lss);
build(rss);
pushdown(o);
}
/*
int pos,val;
void update(int o,int l,int r)
{
if(l==r)
{
sum[o]=val;
return ;
}
int mid=l+r>>1;
if(l<mid)
update(lss);
else
update(rss);
pushdown(o);
}
*/
int ul,ur,uval;
void update(int o,int l,int r)
{
if(l>=ul&&r<=ur)
{
sum[o]+=(r-l+1)*uval;
add[o]+=uval;
return ;
}
if(add[o])
maintain(o,l,r);
int mid=l+r>>1;
if(ul<mid)
update(lss);
if(mid<ur)
update(rss);
pushdown(o);
}
//区间查询
int ql,qr;
int query(int o,int l,int r)
{
if(l>=ql&&r<=qr)
return sum[o];
int ans=0;
int mid=l+r>>1;
if(ql<mid)
ans+=query(lss);
if(qr>mid)
ans+=query(rss);
return ans;
}
};