就是一个用差分后再用树状数组的问题
代码
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int N=100010;
int a[N];
int n,m;
LL tr[N];
int lowbit(int x){
return x&-x;
}
void add(int x,int c){
for(int i=x;i<=n;i+=lowbit(i)){
tr[i]+=c;
}
}
LL sum(int x)
{
LL res = 0;
for (int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}
int main(){
cin >> n >> m;
int last=0;
for(int i=1;i<=n;i++){
int a;
cin >> a;
add(i,a-last);
last=a;
}
while(m--){
int l;char c;
cin >> c >> l;
if(c=='Q'){
cout << sum(l) << "\n";
}else{
int r,v;
cin >> r >> v;
add(l,v);
add(r+1,-v);
}
}
}