代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 200001
int n, f, opt, l, r;
int a[MAXN];
long long k;
long long c1[MAXN], c2[MAXN];
int lowbit(int x){
return x & -x;
}
void add(int i, long long k){
int x = i-1;
while(i <= n){
c1[i] += k;
c2[i] += x*k;
i += lowbit(i);
}
}
void add(int l, int r, long long k){
add(l, k);
add(r+1, -k);
}
long long get_sum(int i){
long long ans = 0;
int x = i;
while (i){
ans += x*c1[i] - c2[i];
i -= lowbit(i);
}
return ans;
}
long long query(int l, int r){
return get_sum(r) - get_sum(l-1);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> f;
for (int i=1; i<=n; i++){
cin >> a[i];
add(i, a[i]-a[i-1]);
}
while (f--){
cin >> opt;
switch (opt){
case 1:
cin >> l >> r >> k;
add(l, r, k);
break;
case 2:
cin >> k;
add(1, 1, k);
break;
case 3:
cin >> k;
add(1, 1, -k);
break;
case 4:
cin >> l >> r;
cout << query(l, r) << '\n';
break;
case 5:
cout << query(1, 1) << '\n';
break;
}
}
return 0;
}
加上:
#define int long long
后即可AC。
但是我不知道为什么这个不可以AC,我认为所有需要开 long long 的地方都已经开了,还有哪些地方要开 long long 吗?