文件详细信息

下载本文件

本文件的大小为 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;
}