线段树全RE求调
查看原帖
线段树全RE求调
636008
blackmonkey楼主2023/8/25 18:41
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll tree[400001],lan[400001],a[100001];
int n,m;
void init(int u,int l,int r){
	if(l==r){
		tree[u]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	init(1<<u,l,mid);
	init(1<<u|1,mid+1,r);
	tree[u]=tree[u<<1]+tree[u<<1|1];	
}
void pushdown(int u,int l,int r,int mid){
	if(lan[u]==0) return;
	lan[u<<1]+=lan[u];
	tree[u<<1]+=lan[u]*(mid-l+1);
	lan[u<<1|1]+=lan[u];
	tree[u<<1|1]+=lan[u]*(r-mid);
	lan[u]=0;
}
ll query(int u,int l,int r,int ql,int qr){
	if(l==ql && r==qr) return tree[u];
	int mid=(l+r)>>1;
	pushdown(u,l,r,mid);
	if(ql<=mid && ql>mid) return query(u<<1,l,mid,ql,mid)+query(u<<1|1,mid+1,r,mid+1,qr);
	else if(qr<=mid) return query(u<<1,l,mid,ql,qr);
	else return query(u<<1|1,mid+1,r,ql,qr);
}
void modify(int u,int l,int r,int ql,int qr,ll v){
	if(l==ql && r==qr){
		tree[u]+=v*r-l+1;
		lan[u]+=v;
	}
	int mid=(l+r)>>1;
	pushdown(u,l,r,mid);
	if(ql<=mid && ql>mid){
		modify(u<<1,l,mid,ql,mid,v);
		modify(u<<1|1,mid+1,r,mid+1,qr,v);
	}
	else if(qr<=mid) modify(u<<1,l,mid,ql,qr,v);
	else modify(u<<1|1,mid+1,r,ql,qr,v);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%lld",&a[i]);
	}
	init(1,1,n);
	int id,x,y;
	long long k;
	while(m--){
		scanf("%d",&id);
		if(id==1){
			scanf("%d%d%lld",&x,&y,&k);
			modify(1,1,n,x,y,k);
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,1,n,x,y));
		}
	}
	return 0;
}
2023/8/25 18:41
加载中...