社区讨论
请问如何直接修改一个区间 玄1关
P3372【模板】线段树 1参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lyfj23k9
- 此快照首次捕获于
- 2024/07/10 15:37 2 年前
- 此快照最后确认于
- 2024/07/10 15:46 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
int w[1232322];
int a[1233222];
void build(int id,int l,int r){
if(l==r){
w[id]=a[l];
return ;
}
int mid=l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
w[id]=w[id*2]+w[id*2+1];
}
int find(int id,int l,int r,int L,int R){
if(l==L&&R==r){
return w[id];
}
int mid=l+r>>1;
if(R<=mid) return find(id<<1,l,mid,L,R);
else if(L>mid) return find(id<<1|1,mid+1,r,L,R);
else return find(id<<1,l,mid,L,mid)+find(id*2+1,mid+1,r,mid+1,R);
}
void add(int id,int l,int r,int pos,int c){
if(l==r) {
w[id]+=c;
return;
}
int mid=l+r>>1;
if(pos<=mid) add(id*2,l,mid,pos,c);
else add(id<<1|1,mid+1,r,pos,c);
w[id]=w[id*2]+w[id*2+1];
}
int n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
int m;
cin>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int op;
cin>>op;
int x,y;
cin>>x>>y;
if(op==2){
cout<<find(1,1,n,x,y)<<endl;
}
else{
int c;
cin>>c;
for(int i=x;i<=y;i++){
add(1,1,n,i,c);
}
}
}
}
/*
5
1 1 1 1 1
3
1 1 2
1 1 3
1 2 4
*/
回复
共 1 条回复,欢迎继续交流。
正在加载回复...