社区讨论

不用lazy的0分,悬关

P3372【模板】线段树 1参与者 3已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lp15um8a
此快照首次捕获于
2023/11/16 20:21
2 年前
此快照最后确认于
2023/11/17 22:14
2 年前
查看原帖
自我认为马蜂还好
不会用lazy但是我觉得这个题用不用差不多
感觉忘了写什么但是又想不起来
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
unsigned long long sum[4*N],a[N];
void updata(int k){
	sum[k]=sum[k*2]+sum[k*2+1];
	return ;
}
void build(int k,int l,int r){
	if(l==r){
		sum[k]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	updata(k);
	return ;
}
void add(int k,int l,int r,int x,int y,int d){
	sum[k]+=d;
	if(x<=l&&r<=y)	return ;
	int mid=(l+r)>>1;
	if(x<=mid)	add(k*2,l,mid,x,y,d);
	if(y>mid)	add(k*2+1,mid+1,r,x,y,d);
	return ;
}
unsigned long long query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)	return sum[k];
	int mid=(l+r)>>1;
	unsigned long long ans=0;
	if(x<=mid)	ans+=query(k*2,l,mid,x,y);
	if(y>mid)	ans+=query(k*2+1,mid+1,r,x,y);
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%llu",&a[i]);
	}
	build(1,1,n);
	int t,x,y,k;
	for(int i=1;i<=m;i++){
		scanf("%d",&t);
		if(t==1){
			scanf("%d%d%d",&x,&y,&k);
			add(1,1,n,x,y,k);
		}
		if(t==2){
			scanf("%d%d",&x,&y);
			unsigned long long ans=query(1,1,n,x,y);
			printf("%llu\n",ans);
		}
	}
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...