社区讨论

求助树状数组区间加

学术版参与者 3已保存回复 9

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@lo3256ko
此快照首次捕获于
2023/10/23 23:33
2 年前
此快照最后确认于
2023/10/23 23:33
2 年前
查看原帖
我是照着OIWikiOI-Wiki上写的,不知道怎么错了QwQQwQ
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int t1[N],t2[N];
int n,m,a,l,r,opt;
inline int lowbit(int x) {return x&-x;}
inline void add(int k,int v) {
	int v1=k*v;
	while(k<=n) {
		t1[k]+=v,t2[k]+=v1;
		k+=lowbit(k);
	}
}
inline void addx(int l,int r,int v) {add(l,v),add(r+1,-v);}
inline int sum(int k,int *t) {
	int res=0;
	while(k) {
		res+=t[k];
		k-=lowbit(k);
	}
	return res;
}
inline int sumx(int l,int r) {
	return (r+1)*sum(r,t1)-l*sum(l-1,t1)-
				(sum(r,t2)-sum(l-1,t2));
}
signed main() {
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i)	scanf("%lld",&a),add(i,a);
	while(m--) {
		scanf("%lld%lld%lld",&opt,&l,&r);
		if(opt==1) {
			scanf("%lld",&a);
			addx(l,r,a);
		}
		else	printf("%lld\n",sumx(l,r));
	}
	return 0;
}

回复

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

正在加载回复...