社区讨论
求助树状数组区间加
学术版参与者 3已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @lo3256ko
- 此快照首次捕获于
- 2023/10/23 23:33 2 年前
- 此快照最后确认于
- 2023/10/23 23:33 2 年前
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 条回复,欢迎继续交流。
正在加载回复...