社区讨论

请问如何直接修改一个区间 玄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 条回复,欢迎继续交流。

正在加载回复...