#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define int long long
int n, k, a[500005], b[500005], id[500005], s[500005], len;
bool g[500005];
void add(int l, int r, long long x) {
int sid = id[l], eid = id[r];
if (sid == eid) {
for (int i = l; i <= r; i++) a[i] += x, s[sid] += x;
return;
}
for (int i = l; id[i] == sid; i++) a[i] += x, s[sid] += x;
for (int i = sid + 1; i < eid; i++) b[i] += x, s[i] += len * x;
for (int i = r; id[i] == eid; i--) a[i] += x, s[eid] += x;
}
long long query(int l, int r) {
int sid = id[l], eid = id[r];
long long ans = 0;
if (sid == eid) {
for (int i = l; i <= r; i++) ans = ans + a[i] + b[sid];
return ans;
}
for (int i = l; id[i] == sid; i++) ans = ans + a[i] + b[sid];
for (int i = sid + 1; i < eid; i++) ans = ans + s[i];
for (int i = r; id[i] == eid; i--) ans = ans + a[i] + b[eid];
return ans;
}
signed main() {
cin >> n >> k;
len = sqrt(500005);
char c;
for (int i = 1; i <= n; i++) {
cin >> a[i];
id[a[i]] = (i - 1) / len + 1;
s[id[i]] += a[i];
g[i] = true;
}
int x, y;
int num;
while (k--) {
cin >> c;
switch (c) {
case 'C':
cin >> x >> y;
add(x, x, -y);
break;
case 'I':
cin >> x >> y;
g[x] = true;
add(x, x, -query(x, x));
add(x, x, y);
break;
case 'D':
cin >> x;
num = 0;
for (int i = 1; ; i++) {
if (g[i]) {
num++;
}
if (num == x) {
num = i;
break;
}
}
add(num, num, -query(num, num));
g[num] = false;
break;
case 'Q':
cout << query(1, 500005) << endl;
break;
}
}
return 0;
}
评测记录