社区讨论

萌新刚学OI,线段树求调

P3368【模板】树状数组 2参与者 8已保存回复 21

讨论操作

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

当前回复
21 条
当前快照
1 份
快照标识符
@lo871e60
此快照首次捕获于
2023/10/27 13:49
2 年前
此快照最后确认于
2023/10/27 13:49
2 年前
查看原帖
CPP
#include<bits/stdc++.h>

using namespace std;

const int maxn=5e5+10;
int n,m;
struct TREE{
	int l,r,num;
}tree[maxn*4];
int input[maxn];

inline void init(int i,int l,int r){
	tree[i].l=l;tree[i].r=r;
	tree[i].num=0;
	if(tree[i].l==tree[i].r){
		return;
	}
 
	int mid=(l+r)/2;
	init(i*2,l,mid);
	init(i*2+1,mid+1,r);
}

inline void revise_line(int i,int l,int r,int k){
	if(tree[i].l>=l && tree[i].r<=r){
		tree[i].num+=k;
		return;
	}
	if(tree[i*2].r>=l) revise_line(i*2,l,r,k);
	if(tree[i*2+1].l<=r) revise_line(i*2+1,l,r,k); 
//	tree[i].num=tree[i*2].num+tree[i*2+1].num;
}

inline int search_dot(int i,int dis){
//	ans+=tree[i].num; 
	if(tree[i].l==tree[i].r){
		return tree[i].num;
//		return;
	}
	
	int s=0;
	if(dis<=tree[i*2].r) s+=search_dot(i*2,dis);
	if(dis>=tree[i*2+1].l) s+=search_dot(i*2+1,dis);
	return s;
}

int main(){
	
	cin>>n>>m;
	
	for(int i=1;i<=n;i++){
		cin>>input[i];
	}
	
	init(1,1,n);
	for(int i=1;i<=m;i++){
		int t,a,b,c;
		cin>>t;
		if(t==1){
			cin>>a>>b>>c;
			//区间修改 
			revise_line(1,a,b,c); 
		} else {
			//单点查询
			cin>>a; 
			cout<<search_dot(1,a)+input[a]<<endl;
		}
	}
	
	return 0;
}

回复

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

正在加载回复...