代码(已省略快读)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define rg register
#define rep(_vr, _st, _ed) for(rg int _vr=_st; (_vr)<=(_ed); _vr++)
typedef long long ll;
const int maxn=500000;
int n;
ll a[maxn+20]={0}, b[maxn+20]={0};
inline int lowbit(int x) { return x&(-x); }
void bit_modify(int pos, ll val) {
for (rg int i=pos; i<=n; i+=lowbit(i)) b[i]+=val;
}
ll bit_query(int pos) {
ll ans=0;
for (rg int i=pos; i>0; i-=lowbit(i)) ans+=b[i];
return ans;
}
int main()
{
int q; read(n); read(q);
rep(i, 1, n) {
read(a[i]);
bit_modify(i, a[i]-a[i-1]);
}
while (q--) {
rg int op, x, y, z;
read(op); read(x);
if (op==1) {
read(y); read(z);
bit_modify(x, z);
bit_modify(y+1, -z);
} else {
printf("%lld\n", bit_query(x));
}
}
return 0;
}
样例答案是 6 10 ,但我的程序输出 6 12
硬着头皮交上去,结果 AC 了
真有趣。