LAICZ @ 2023-07-18 11:28:10
#include <bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;
template <typename T>
struct BIT{
int n;
vector <T> bit;
void fwk(int _n){
n = _n;
bit.resize(n);
}
void add(int pos,T val){
int p = pos;
while(p <= n){
bit[p] += val;
p += lowbit(p);
}
}
T sum(int pos){
int p = pos;
T ret = 0;
while(p > 0){
ret += bit[p];
p -= lowbit(p);
}
return ret;
}
T query(int l,int r){
return sum(r) - sum(l - 1);
}
};
BIT <int> d1,d,a;
int sum_a(int i){
return (i + 1) * d.query(1,i) - d1.query(1,i);
}
int query_a(int l,int r){
return sum_a(r) - sum_a(l - 1);
}
int main(){
int n,m;
cin>>n>>m;
a.fwk(n + 5),d.fwk(n + 5),d1.fwk(n + 5);
for(int i = 1;i <= n;i++){
int t;
cin>>t;
a.add(i,t);
d.add(i,t - a.query(i - 1,i - 1));
d1.add(i,i * d.query(i,i));
}
for(int i = 1;i <= m;i++){
int op,x,y,k;
cin>>op>>x>>y;
if(op == 1){
cin>>k;
d.add(x,k);
d.add(y + 1,-k);
d1.add(x,k * x);
d1.add(y + 1,-k * x);
}else{
cout<<query_a(x,y)<<endl;
}
}
}
求调。BIT封装树状数组,里面操作肯定正确,怀疑是我公式推导出了问题
蒟蒻公式推导
by LAICZ @ 2023-07-18 11:29:02
d是正常对a的差分,d1是i倍的对应的d