求调,70分
查看原帖
求调,70分
752094
MornHus楼主2023/3/31 21:25
#include<bits/stdc++.h>
using namespace std;
long long read(){
	long long x=0;
	long long f=1;
	char c=getchar();
	while(c>'9'||c<'0'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+(c^'0');
		c=getchar();
	}
	return x*f;
}
int n,m;
long long tree[100001<<2];
long long lazy[100001<<2];
void pushup(int k){
	tree[k]=tree[k<<1]+tree[k<<1|1];
}
void build(int k,int l,int r){
	if(l==r){
		tree[k]=read();
	}else{
		int mid=(l+r)>>1;
		build(k<<1,l,mid);
		build(k<<1|1,mid+1,r);
		pushup(k);
	}
}
void pushdown(int k,int l,int r){
	if(lazy[k]){
		int mid=(l+r)>>1;
		lazy[k<<1]+=lazy[k];
		lazy[k<<1|1]+=lazy[k];
		tree[k<<1]+=lazy[k]*(mid-l+1);
		tree[k<<1|1]+=lazy[k]*(r-mid);
		lazy[k]=0;
	}
}
void update(int L,int R,int l,int r,int k,long long val){
	if(L<=l&&r<=R){
		tree[k]+=(r-l+1)*val;
		lazy[k]+=val;
	}else{
		int mid=(l+r)>>1;
		pushdown(k,l,r);
		if(L<=mid){
			update(L,R,l,mid,k<<1,val);
		}
		if(R>mid){
			update(L,R,mid+1,r,k<<1|1,val);
		}
		pushup(k);
	}
}
long long query(int L,int R,int l,int r,int k){
	if(L<=l&&r<=R){
		return tree[k];
	}else{
		int mid=(l+r)>>1;
		pushdown(k,l,r);
		int ans=0;
		if(L<=mid){
			ans+=query(L,R,l,mid,k<<1);
		}
		if(R>mid){
			ans+=query(L,R,mid+1,r,k<<1|1);
		}
		pushup(k);
		return ans;
	}
}
int main(){
	n=read();
	m=read();
	build(1,1,n);
	int opt;
	long long k;
	for(int i=1,x,y;i<=m;i++){
		opt=read();
		x=read();
		y=read();
		if(opt==1){
			k=read();
			update(x,y,1,n,1,k);
		}else{
			printf("%lld\n",query(x,y,1,n,1));
		}
	}
	return 0;
}
2023/3/31 21:25
加载中...