AcWing 242. 一个简单的整数问题
树状数组模板题,利用差分对区间进行加减操作,最后求单点和
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int a[N];
int tr[N];
int n, m;
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;
}
}
int sum(int x){
int res = 0;
for(int i = x; i; i -= lowbit(i)){
res += tr[i];
}
return res;
}
signed main()
{
cin>>n>>m;
for(int i = 1; i <= n; i ++ ){
cin>>a[i];
}
for(int i = 1; i <= n; i ++ ){
add(i, a[i] - a[i - 1]); //差分数组入树状数组
}
for(int i = 1; i <= m; i ++ ){
string op;
int l, r, d;
cin>>op>>l;
if(op == "Q"){
cout<<sum(l)<<endl;
}
else{
cin>>r>>d;
add(l, d);
add(r + 1, -d);
}
}
return 0;
}