样例过了,提交全WA
#include <cstdio>
const int N = 1e5 + 5;
const int kMax = 1e5;
typedef long long LL;
int n, m, a[N], exi[N];
int x, y;
char c;
class BIT {
public:
BIT () {}
~BIT () {}
void upd (int x, int v) {
for ( ; x <= kMax; x += x & -x)
c[x] += v;
}
LL qry (int x) {
LL rs = 0;;
for ( ; x; x -= x & -x)
rs += c[x];
return rs;
}
private:
int c[N];
} GF, cnt ;
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
exi[i] = 1;
GF.upd(i, a[i]),
cnt.upd(i, 1);
}
getchar();
for (int i = 1; i <= m; ++i) {
scanf("%c", &c);
if (c == 'C') {
scanf("%d%d", &x, &y);
GF.upd(x, -y);
}
else if (c == 'I') {
scanf("%d%d", &x, &y);
GF.upd(x, y - a[x]), a[x] = y;
if (!exi[x]) {
cnt.upd(x, 1), exi[x] = 1;
}
}
else if (c == 'D') {
scanf("%d", &x);
int L = x - 1, R = kMax + 1;
while (L + 1 < R) {
int mid = (L + R) >> 1;
// printf("****%d %d %d\n", L, R, mid);
if (cnt.qry(mid) <= x) L = mid;
else R = mid;
}
GF.upd(L, -a[L]), a[L] = 0;
cnt.upd(L, -1), exi[L] = 0;
}
else {
printf("%lld\n", GF.qry(kMax));
}
getchar();
}
return 0;
}