社区讨论

关于树状数组

学术版参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lodnf847
此快照首次捕获于
2023/10/31 09:27
2 年前
此快照最后确认于
2023/11/07 00:08
2 年前
查看原帖
求助,下面的写法为什么不对?
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+2020;
int delta[N],n,q,a[N];
int lowbit(int x) {
	return x&(-x);
}
void add(int x,int val) {
	while(x<=n) delta[x]+=val,x+=lowbit(x);
}
int sum(int r) {
	int ret=0;
	while(r) ret+=delta[r],r-=lowbit(r);
	return ret;
}
signed main() {
//	freopen("P3368_1.in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n>>q;
	for(int i=1; i<=n; ++i)
	{
		scanf("%lld",&a[i]);
		delta[i]=a[i]-a[i-1];
		add(i,delta[i]);
	}
	while(q--) {
		int opt,l,r,x;
		scanf("%lld",&opt);
		if(opt==1) scanf("%lld %lld %lld",&l,&r,&x),add(l,x),add(r+1,-x);
		else if(opt==2) scanf("%lld",&x),cout<<sum(x)<<'\n';
	}
	return 0;
}

回复

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

正在加载回复...