(1) A a b t:代表将区间[a,b]上每个数字加上t;
(2) X t :代表将第t个位置上的数变成 1;
(3) Q t :代表询问第t个位置上的数字是多少
#include<bits/stdc++.h>
using namespace std;
int n, m, arr[500005] = {0};
long long t[500005];
void add(int pos, int x) {
while (pos <= n) {
t[pos] += x;
pos += -pos & pos;
}
}
long long sum(int x) {
long long res = 0;
while (x) {
res += t[x];
x -= -x & x;
}
return res;
}
int main() {
int a = 0, b, t;
char type;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
add(i, arr[i] - arr[i - 1]); //区间修改用差分数组构建树状数组
}
for (int i = 1; i <= m; i++) {
scanf(" %c", &type);
if (type == 'A') {
scanf("%d%d%d", &a, &b, &t);
add(a, t);
add(b + 1, -t);
} else if (type == 'X') {
scanf("%d", &t);
long long ans = 0;
ans = 1 - sum(t);
add(t, ans);
add(t + 1, -ans);
} else {
scanf("%d", &t);
printf("%lld\n", sum(t));
}
}
return 0;
}