15分求调
查看原帖
15分求调
794062
zhazesheng楼主2025/7/22 15:37
#include<bits/stdc++.h>
using namespace std;
#define N 200005
//#define mid ((l+r)>>1)
#define int long long
int n,m,a[N];
struct node{int num,lazy;}tr[N<<2];
inline void pushup(int x){tr[x].num=tr[x<<1].num+tr[x<<1|1].num;}
inline void pushdown(int x,int l,int r){
	if(tr[x].lazy==0) return ;
	int mid=(l+r)>>1;
	tr[x<<1].lazy+=tr[x].lazy;
	tr[x<<1|1].lazy+=tr[x].lazy;
	tr[x<<1].num+=(mid-l+1)*tr[x].lazy;
	tr[x<<1|1].num+=(r-mid)*tr[x].lazy;
	tr[x].lazy=0;
	return ;
}
void build(int x,int l,int r){
	if(l==r){
		tr[x].num=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
	return ;
}
void edit(int x,int l,int r,int ql,int qr,int d){
	if(r<ql||l>qr) return ;
	if(ql<=l&&r<=qr){
		tr[x].num+=d*(r-l+1);
		tr[x].lazy+=d;
		return ;
	}
	int mid=(r+l)>>1;
	if(ql<=mid) edit(x<<1,l,mid,ql,qr,d);
	if(qr>mid) edit(x<<1|1,mid+1,r,ql,qr,d);
	pushup(x); 
	return ;
}
int query(int x,int l,int r,int ql,int qr){
	pushdown(x,l,r);
	if(r<ql||l>qr) return 0;
	if(ql<=l&&r<=qr){return tr[x].num;}
	int ret=0;
	int mid=(l+r)>>1;
	if(ql<=mid) ret+=query(x<<1,l,mid,ql,qr);
	if(qr>mid) ret+=query(x<<1|1,mid+1,r,ql,qr);
	return ret; 
}
int reada(){
	int x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
signed main(){
	n=reada();m=reada();
	for(int i=1;i<=n;i++) a[i]=reada();
	build(1,1,n);
	int op,ql,qr,k;
	for(int i=1;i<=m;i++){
		op=reada();
		if(op==1){
			ql=reada();qr=reada();k=reada();
			edit(1,1,n,ql,qr,k);
		}
		if(op==2){
			ql=reada(),qr=reada();
			printf("%lld\n",query(1,1,n,ql,qr));
		}
	}
	return 0;
}
2025/7/22 15:37
加载中...