线段树板子悬赏关注在线求调
  • 板块灌水区
  • 楼主zjq123victorW
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/1/12 16:45
  • 上次更新2023/10/24 04:34:21
查看原帖
线段树板子悬赏关注在线求调
377449
zjq123victorW楼主2023/1/12 16:45

在线等,谢谢

#include<bits/stdc++.h>
#define N 100002
#define ll long long
using namespace std;
int b[N],n,m;
struct node{
	int l,r;
	ll sum,lazy;
}a[N<<2];
void updata(int k){
	a[k].sum=a[k<<1].sum+a[k<<1|1].sum;
	return;
}
void pushdown(int k){
	if(a[k].l==a[k].r){a[k].lazy=0;return;}
	a[k<<1].sum+=(a[k<<1].r-a[k<<1].l+1)*a[k].lazy;
	a[k<<1|1].sum+=(a[k<<1|1].r-a[k<<1|1].l+1)*a[k].lazy;
	a[k<<1].lazy+=a[k].lazy;
	a[k<<1|1].lazy+=a[k].lazy;
	a[k].lazy=0;
}
void build(int k,int l,int r){
	a[k].l=l,a[k].r=r;
	if(l==r){
		a[l].sum=b[l];
		return;
	}
	int mid=(l+r)>>1;	
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	updata(k);
}
void change_many(int k,int l,int r,int x){
	if(a[k].l==l&&a[k].r==r){
		a[k].sum+=(r-l+1)*x;
		a[k].lazy+=x;return;
	}
	int mid=(a[k].l+a[k].r)>>1;
	if(r<=mid) change_many(k<<1,l,r,x);
	else if(l>mid) change_many(k<<1|1,l,r,x);
	else change_many(k<<1,l,mid,x),change_many(k<<1|1,mid+1,r,x);
	updata(k);
}
ll get_many(int k,int l,int r){
	if(a[k].lazy) pushdown(k);
	if(a[k].l==l&&a[k].r==r) return a[k].sum;
	int mid=(a[k].l+a[k].r)>>1;
	if(r<=mid) return get_many(k<<1,l,r);
	if(l>mid) return get_many(k<<1|1,l,r);
	return get_many(k<<1,l,mid)+get_many(k<<1|1,mid+1,r);
}
inline int read(){
	char ch=getchar();
	int x=0,f=1;
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
	return x*f;
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		b[i]=read();
	}
	build(1,1,n);
	while(m--){
		if(read()==1)change_many(1,read(),read(),read());
		else printf("%lld\n",get_many(1,read(),read()));
	}
 	return 0;
}


2023/1/12 16:45
加载中...