社区讨论
不用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 条回复,欢迎继续交流。
正在加载回复...