文件详细信息
本文件的大小为 1498 字节。
#include<cstdio>
typedef long long ll;
template<typename T>
void read(T&num){
int ch=getchar();
num=0;
while(ch<48||ch>57)ch=getchar();
while(ch>=48&&ch<=57)num=(num<<3)+(num<<1)+(ch^48),ch=getchar();
}
void write(ll a){
static int ch[25],cnt;
if(a==0)putchar('0');
cnt=0;
while(a)ch[++cnt]=a%10|48,a/=10;
while(cnt)putchar(ch[cnt--]);
}
const int maxn=100005;
int n,m,opt,x,y;
ll k,a[maxn];
ll val[maxn<<2],tag[maxn<<2];
void pushup(int u){
val[u]=val[u<<1]+val[u<<1|1];
}
void pushdown(int u,int l,int r,int m){
if(tag[u]){
val[u<<1]+=tag[u]*(m-l+1);
val[u<<1|1]+=tag[u]*(r-m);
tag[u<<1]+=tag[u];
tag[u<<1|1]+=tag[u];
tag[u]=0;
}
}
void build(int u,int l,int r){
if(l==r){
val[u]=a[l];
return;
}
int m=(l+r)>>1;
build(u<<1,l,m);
build(u<<1|1,m+1,r);
pushup(u);
}
void modify(int u,int l,int r,int ql,int qr,ll v){
if(ql<=l&&r<=qr){
val[u]+=v*(r-l+1);
tag[u]+=v;
return;
}
int m=(l+r)>>1;
pushdown(u,l,r,m);
if(ql<=m)modify(u<<1,l,m,ql,qr,v);
if(qr>m)modify(u<<1|1,m+1,r,ql,qr,v);
pushup(u);
}
ll query(int u,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return val[u];
int m=(l+r)>>1;
pushdown(u,l,r,m);
ll answer=0;
if(ql<=m)answer+=query(u<<1,l,m,ql,qr);
if(qr>m)answer+=query(u<<1|1,m+1,r,ql,qr);
return answer;
}
int main(){
read(n),read(m);
for(int i=1;i<=n;i++)read(a[i]);
build(1,1,n);
while(m--){
read(opt),read(x),read(y);
if(opt==1){
read(k);
modify(1,1,n,x,y,k);
}else printf("%lld\n",query(1,1,n,x,y));
}
return 0;
}