#include <bits/stdc++.h>
using namespace std;
#define cint const int
#define pb push_back
#define mid(l, r) ((l + r) >> 1)
#define left(id) (id << 1)
#define right(id) (id << 1 | 1)
const int MAXN = 2e5 + 15;
const int oo = 1e9;
int N, Q;
int A[MAXN];
struct query {
int t, x, a, b;
} q[MAXN];
struct ZIP {
vector<int> v;
void ADD(int x) {
v.pb(x);
}
void INIT() {
sort(v.begin(), v.end());
v.resize(distance(v.begin(), unique(v.begin(), v.end())));
}
int get(int x) {
return lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
}
} ZIP;
struct Seg {
struct DATA {
int ma = -oo;
int L = -oo;
int R = -oo;
int S = -oo;
} it[MAXN * 9];
DATA Merge(DATA a, DATA b) {
DATA ans;
ans.S = a.S + b.S;
if (ans.S < -oo) ans.S = -oo;
ans.L = max(a.L, a.S + b.L);
ans.R = max(b.R, a.R + b.S);
ans.ma = max({a.ma, b.ma, a.R + b.L});
return ans;
}
void update(cint &id, cint &l, cint &r, cint &u, cint &v, cint &t) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
if (t == 1) it[id].S = it[id].L = it[id].R = it[id].ma = 1;
else it[id].L = it[id].R = it[id].S = it[id].ma = -oo;
return;
}
int mid = mid(l, r);
update(left(id), l, mid, u, v, t);
update(right(id), mid + 1, r, u, v, t);
it[id] = Merge(it[left(id)], it[right(id)]);
}
DATA get(cint &id, cint &l, cint &r, cint &u, cint &v) {
if (l > v || r < u) return {-oo, -oo, -oo, -oo};
if (u <= l && r <= v) return it[id];
int mid = mid(l, r);
DATA it1 = get(left(id), l, mid, u, v);
DATA it2 = get(right(id), mid + 1, r, u, v);
return Merge(it1, it2);
}
} ST;
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> Q;
map<int, int> m;
for (int i = 1; i <= N; i++) {
cin >> A[i];
m[A[i]]++;
ZIP.ADD(A[i]);
ZIP.ADD(A[i] + 1);
ZIP.ADD(A[i] - 1);
}
for (int i = 1; i <= Q; i++) {
char c;
cin >> c;
if (c == '-') {
q[i].t = 1;
cin >> q[i].x;
ZIP.ADD(q[i].x);
ZIP.ADD(q[i].x + 1);
ZIP.ADD(q[i].x - 1);
}
if (c == '+') {
q[i].t = 2;
cin >> q[i].x;
ZIP.ADD(q[i].x);
ZIP.ADD(q[i].x + 1);
ZIP.ADD(q[i].x - 1);
}
if (c == '?') {
q[i].t = 3;
cin >> q[i].a >> q[i].b;
ZIP.ADD(q[i].a);
ZIP.ADD(q[i].a + 1);
ZIP.ADD(q[i].a - 1);
ZIP.ADD(q[i].b);
ZIP.ADD(q[i].b + 1);
ZIP.ADD(q[i].b - 1);
}
}
ZIP.INIT();
int T = ZIP.v.size();
for (int i = 1; i <= N; i++) {
int tmp = ZIP.get(A[i]);
ST.update(1, 1, T, tmp, tmp, 1);
}
for (int i = 1; i <= Q; i++) {
if (q[i].t == 1) {
if (m[q[i].x]) {
m[q[i].x]--;
if (m[q[i].x] == 0) {
int tmp = ZIP.get(q[i].x);
ST.update(1, 1, T, tmp, tmp, 2);
}
}
}
if (q[i].t == 2) {
m[q[i].x]++;
int tmp = ZIP.get(q[i].x);
ST.update(1, 1, T, tmp, tmp, 1);
}
if (q[i].t == 3) {
int tmp1 = ZIP.get(q[i].a - 1);
int tmp2 = ZIP.get(q[i].a);
int tmp3 = ZIP.get(q[i].b);
int tmp4 = ZIP.get(q[i].b + 1);
ST.update(1, 1, T, tmp1, tmp1, 2);
ST.update(1, 1, T, tmp4, tmp4, 2);
int res = ST.get(1, 1, T, tmp2, tmp3).ma;
if (res == -oo) cout << 0 << '\n';
else cout << res << '\n';
if (m[q[i].a - 1]) ST.update(1, 1, T, tmp1, tmp1, 1);
if (m[q[i].b + 1]) ST.update(1, 1, T, tmp4, tmp4, 1);
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgY2ludCBjb25zdCBpbnQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBtaWQobCwgcikgKChsICsgcikgPj4gMSkKI2RlZmluZSBsZWZ0KGlkKSAoaWQgPDwgMSkKI2RlZmluZSByaWdodChpZCkgKGlkIDw8IDEgfCAxKQoKY29uc3QgaW50IE1BWE4gPSAyZTUgKyAxNTsKY29uc3QgaW50IG9vICAgPSAxZTk7CgppbnQgTiwgUTsKaW50IEFbTUFYTl07CgpzdHJ1Y3QgcXVlcnkgewogICAgaW50IHQsIHgsIGEsIGI7Cn0gcVtNQVhOXTsKCnN0cnVjdCBaSVAgewogICAgdmVjdG9yPGludD4gdjsKCiAgICB2b2lkIEFERChpbnQgeCkgewogICAgICAgIHYucGIoeCk7CiAgICB9CgogICAgdm9pZCBJTklUKCkgewogICAgICAgIHNvcnQodi5iZWdpbigpLCB2LmVuZCgpKTsKICAgICAgICB2LnJlc2l6ZShkaXN0YW5jZSh2LmJlZ2luKCksIHVuaXF1ZSh2LmJlZ2luKCksIHYuZW5kKCkpKSk7CiAgICB9CgogICAgaW50IGdldChpbnQgeCkgewogICAgICAgIHJldHVybiBsb3dlcl9ib3VuZCh2LmJlZ2luKCksIHYuZW5kKCksIHgpIC0gdi5iZWdpbigpICsgMTsKICAgIH0KfSBaSVA7CgpzdHJ1Y3QgU2VnIHsKICAgIHN0cnVjdCBEQVRBIHsKICAgICAgICBpbnQgbWEgPSAtb287CiAgICAgICAgaW50IEwgPSAtb287CiAgICAgICAgaW50IFIgPSAtb287CiAgICAgICAgaW50IFMgPSAtb287CiAgICB9IGl0W01BWE4gKiA5XTsKCiAgICBEQVRBIE1lcmdlKERBVEEgYSwgREFUQSBiKSB7CiAgICAgICAgREFUQSBhbnM7CiAgICAgICAgYW5zLlMgPSBhLlMgKyBiLlM7CiAgICAgICAgaWYgKGFucy5TIDwgLW9vKSBhbnMuUyA9IC1vbzsKICAgICAgICBhbnMuTCA9IG1heChhLkwsIGEuUyArIGIuTCk7CiAgICAgICAgYW5zLlIgPSBtYXgoYi5SLCBhLlIgKyBiLlMpOwogICAgICAgIGFucy5tYSA9IG1heCh7YS5tYSwgYi5tYSwgYS5SICsgYi5MfSk7CiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZShjaW50ICZpZCwgY2ludCAmbCwgY2ludCAmciwgY2ludCAmdSwgY2ludCAmdiwgY2ludCAmdCkgewogICAgICAgIGlmIChsID4gdiB8fCByIDwgdSkgcmV0dXJuOwogICAgICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSB7CiAgICAgICAgICAgIGlmICh0ID09IDEpIGl0W2lkXS5TID0gaXRbaWRdLkwgPSBpdFtpZF0uUiA9IGl0W2lkXS5tYSA9IDE7CiAgICAgICAgICAgIGVsc2UgaXRbaWRdLkwgPSBpdFtpZF0uUiA9IGl0W2lkXS5TID0gaXRbaWRdLm1hID0gLW9vOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpbnQgbWlkID0gbWlkKGwsIHIpOwogICAgICAgIHVwZGF0ZShsZWZ0KGlkKSwgbCwgbWlkLCB1LCB2LCB0KTsKICAgICAgICB1cGRhdGUocmlnaHQoaWQpLCBtaWQgKyAxLCByLCB1LCB2LCB0KTsKCiAgICAgICAgaXRbaWRdID0gTWVyZ2UoaXRbbGVmdChpZCldLCBpdFtyaWdodChpZCldKTsKICAgIH0KCiAgICBEQVRBIGdldChjaW50ICZpZCwgY2ludCAmbCwgY2ludCAmciwgY2ludCAmdSwgY2ludCAmdikgewogICAgICAgIGlmIChsID4gdiB8fCByIDwgdSkgcmV0dXJuIHstb28sIC1vbywgLW9vLCAtb299OwogICAgICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gaXRbaWRdOwoKICAgICAgICBpbnQgbWlkID0gbWlkKGwsIHIpOwogICAgICAgIERBVEEgaXQxID0gZ2V0KGxlZnQoaWQpLCBsLCBtaWQsIHUsIHYpOwogICAgICAgIERBVEEgaXQyID0gZ2V0KHJpZ2h0KGlkKSwgbWlkICsgMSwgciwgdSwgdik7CgogICAgICAgIHJldHVybiBNZXJnZShpdDEsIGl0Mik7CiAgICB9Cn0gU1Q7CgoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQudGllKDApOwoKCiAgICBjaW4gPj4gTiA+PiBROwogICAgbWFwPGludCwgaW50PiBtOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CiAgICAgICAgY2luID4+IEFbaV07CiAgICAgICAgbVtBW2ldXSsrOwogICAgICAgIFpJUC5BREQoQVtpXSk7CiAgICAgICAgWklQLkFERChBW2ldICsgMSk7CiAgICAgICAgWklQLkFERChBW2ldIC0gMSk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gUTsgaSsrKSB7CiAgICAgICAgY2hhciBjOwogICAgICAgIGNpbiA+PiBjOwogICAgICAgIGlmIChjID09ICctJykgewogICAgICAgICAgICBxW2ldLnQgPSAxOwogICAgICAgICAgICBjaW4gPj4gcVtpXS54OwogICAgICAgICAgICBaSVAuQUREKHFbaV0ueCk7CiAgICAgICAgICAgIFpJUC5BREQocVtpXS54ICsgMSk7CiAgICAgICAgICAgIFpJUC5BREQocVtpXS54IC0gMSk7CiAgICAgICAgfQogICAgICAgIGlmIChjID09ICcrJykgewogICAgICAgICAgICBxW2ldLnQgPSAyOwogICAgICAgICAgICBjaW4gPj4gcVtpXS54OwogICAgICAgICAgICBaSVAuQUREKHFbaV0ueCk7CiAgICAgICAgICAgIFpJUC5BREQocVtpXS54ICsgMSk7CiAgICAgICAgICAgIFpJUC5BREQocVtpXS54IC0gMSk7CiAgICAgICAgfQogICAgICAgIGlmIChjID09ICc/JykgewogICAgICAgICAgICBxW2ldLnQgPSAzOwogICAgICAgICAgICBjaW4gPj4gcVtpXS5hID4+IHFbaV0uYjsKICAgICAgICAgICAgWklQLkFERChxW2ldLmEpOwogICAgICAgICAgICBaSVAuQUREKHFbaV0uYSArIDEpOwogICAgICAgICAgICBaSVAuQUREKHFbaV0uYSAtIDEpOwogICAgICAgICAgICBaSVAuQUREKHFbaV0uYik7CiAgICAgICAgICAgIFpJUC5BREQocVtpXS5iICsgMSk7CiAgICAgICAgICAgIFpJUC5BREQocVtpXS5iIC0gMSk7CiAgICAgICAgfQogICAgfQoKICAgIFpJUC5JTklUKCk7CiAgICBpbnQgVCA9IFpJUC52LnNpemUoKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE47IGkrKykgewogICAgICAgIGludCB0bXAgPSBaSVAuZ2V0KEFbaV0pOwogICAgICAgIFNULnVwZGF0ZSgxLCAxLCBULCB0bXAsIHRtcCwgMSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBROyBpKyspIHsKICAgICAgICBpZiAocVtpXS50ID09IDEpIHsKICAgICAgICAgICAgaWYgKG1bcVtpXS54XSkgewogICAgICAgICAgICAgICAgbVtxW2ldLnhdLS07CiAgICAgICAgICAgICAgICBpZiAobVtxW2ldLnhdID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdG1wID0gWklQLmdldChxW2ldLngpOwogICAgICAgICAgICAgICAgICAgIFNULnVwZGF0ZSgxLCAxLCBULCB0bXAsIHRtcCwgMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHFbaV0udCA9PSAyKSB7CiAgICAgICAgICAgIG1bcVtpXS54XSsrOwogICAgICAgICAgICBpbnQgdG1wID0gWklQLmdldChxW2ldLngpOwogICAgICAgICAgICBTVC51cGRhdGUoMSwgMSwgVCwgdG1wLCB0bXAsIDEpOwogICAgICAgIH0KICAgICAgICBpZiAocVtpXS50ID09IDMpIHsKICAgICAgICAgICAgaW50IHRtcDEgPSBaSVAuZ2V0KHFbaV0uYSAtIDEpOwogICAgICAgICAgICBpbnQgdG1wMiA9IFpJUC5nZXQocVtpXS5hKTsKICAgICAgICAgICAgaW50IHRtcDMgPSBaSVAuZ2V0KHFbaV0uYik7CiAgICAgICAgICAgIGludCB0bXA0ID0gWklQLmdldChxW2ldLmIgKyAxKTsKCiAgICAgICAgICAgIFNULnVwZGF0ZSgxLCAxLCBULCB0bXAxLCB0bXAxLCAyKTsKICAgICAgICAgICAgU1QudXBkYXRlKDEsIDEsIFQsIHRtcDQsIHRtcDQsIDIpOwoKICAgICAgICAgICAgaW50IHJlcyA9IFNULmdldCgxLCAxLCBULCB0bXAyLCB0bXAzKS5tYTsKCiAgICAgICAgICAgIGlmIChyZXMgPT0gLW9vKSBjb3V0IDw8IDAgPDwgJ1xuJzsKICAgICAgICAgICAgZWxzZSBjb3V0IDw8IHJlcyA8PCAnXG4nOwoKICAgICAgICAgICAgaWYgKG1bcVtpXS5hIC0gMV0pIFNULnVwZGF0ZSgxLCAxLCBULCB0bXAxLCB0bXAxLCAxKTsKICAgICAgICAgICAgaWYgKG1bcVtpXS5iICsgMV0pIFNULnVwZGF0ZSgxLCAxLCBULCB0bXA0LCB0bXA0LCAxKTsKICAgICAgICB9CiAgICB9Cn0K