int tr[N];//tr[x]存的是[x-lowbit[x]+1, x]的和 lowbit[x]-1为长度
int lowbit(int x)
{
return x & -x;
}
//树状数组存的是1-n的的前缀和
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;
}
242. 一个简单的整数问题 - AcWing题库
#include<iostream>
using namespace std;
const int N = 1e5+10;
typedef long long ll;
int n, m, a[N];
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()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++) add(i, a[i] - a[i-1]);
while(m--)
{
char c;
cin >> c;
if (c == 'Q')
{
int x;
scanf("%d", &x);
printf("%lld\n", sum(x));
}
else
{
int l, r, d;
scanf("%d%d%d", &l, &r, &d);
add(l, d), add(r+1, -d);
}
}
return 0;
}