社区讨论
求调
P3372【模板】线段树 1参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjueg9j
- 此快照首次捕获于
- 2025/11/04 08:40 4 个月前
- 此快照最后确认于
- 2025/11/04 08:40 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
void build(int,int,int);
const int maxn=1e5+1;
int a[4*maxn],flag[4*maxn];
int n,m;
int mid(int l,int r){
return (l+r)/2;
}
int ls(int p){
return (p*2);
}
int rs(int p){
return (p*2+1);
}
int siz(int l,int r){
return (r-l+1);
}
void init(){
cin>>n>>m;
build(1,n,1);
}
void pushup(int p){
a[p]=a[ls(p)]+a[rs(p)];
}
void pushdown(int l,int r,int p){
if(flag[p]!=0){
flag[ls(p)]=flag[rs(p)]=flag[p];
a[ls(p)]=siz(l,mid(l,r))*flag[p];
a[rs(p)]=siz(mid(l,r)+1,r)*flag[p];
flag[p]=0;
}
return;
}
void build(int l,int r,int p){
if(l==r){
cin>>a[p];
return;
}
int m=mid(l,r);
build(l,m,ls(p));
build(m+1,r,rs(p));
pushup(p);
return;
}
void update(int L,int R,int add,int l,int r,int p){
if(L<=l && R>=r){
flag[p]+=add;
a[p]+=flag[p]*siz(l,r);
return;
}
int m=mid(l,r);
if(L<=m) update(L,R,add,l,m,ls(p));
if(R>=m+1) update(L,R,add,m+1,r,rs(p));
pushup(p);
return;
}
int query(int L,int R,int l,int r,int p){
int res=0;
if(L<=l && R>=r){
return a[p];
}
int m=mid(l,r);
pushdown(l,r,p);
if(L<=m) res+=query(L,R,l,m,ls(p));
if(R>=m+1) res+=query(L,R,m+1,r,rs(p));
return res;
}
int main(){
init();
for(int i=1;i<=m;i++){
int temp;
cin>>temp;
if(temp==1){
int x,y,k;
cin>>x>>y>>k;
update(x,y,k,1,n,1);
}
else{
int x,y;
cin>>x>>y;
cout<<query(x,y,1,n,1)<<endl;
}
}
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...