求助树状数组区间加
  • 板块学术版
  • 楼主SilverLi
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/2/27 21:11
  • 上次更新2023/10/23 23:33:41
查看原帖
求助树状数组区间加
688783
SilverLi楼主2023/2/27 21:11

ThisThis

我是照着OIWikiOI-Wiki上写的,不知道怎么错了QwQQwQ

#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;
}
2023/2/27 21:11
加载中...