#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 2e5 + 5;
const int Q = 2e5 + 5;
struct query {
char type;
int a, b;
};
struct fenwick {
int n;
vector<int> ft;
fenwick(int n) : n(n) {
ft.resize(n, 0);
}
void update(int pos, int val) {
for (; pos < n; pos = pos | (pos + 1)) ft[pos] += val;
}
int get(int pos) {
int ans = 0;
for (; pos >= 0; pos = (pos & (pos + 1)) - 1) ans += ft[pos];
return ans;
}
};
int n, q;
int p[N];
query queries[Q];
int sz;
vector<int> vals; // danh sách các giá trị cần nén
int getVal(int x) {
return lower_bound(vals.begin(), vals.end(), x) - vals.begin();
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> p[i];
for (int i = 1; i <= n; i++) vals.push_back(p[i]);
for (int i = 1; i <= q; i++) {
char type; cin >> type;
if (type == '!') {
int pos, x;
cin >> pos >> x;
vals.push_back(x);
queries[i] = {type, pos, x};
}
else {
int l, r;
cin >> l >> r;
vals.push_back(l); vals.push_back(r);
queries[i] = {type, l, r};
}
}
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
sz = vals.size();
fenwick BIT(sz);
for (int i = 1; i <= n; i++) {
p[i] = getVal(p[i]);
BIT.update(p[i], 1);
}
for (int i = 1; i <= q; i++) {
char type = queries[i].type;
if (type == '!') {
int pos = queries[i].a, x = queries[i].b;
BIT.update(p[pos], -1);
p[pos] = getVal(x);
BIT.update(p[pos], 1);
}
else {
int l = queries[i].a, r = queries[i].b;
l = getVal(l), r = getVal(r);
int ans = BIT.get(r) - BIT.get(l - 1);
cout << ans << '\n';
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCiAKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAogCmNvbnN0IGludCBJTkYgPSAxZTk7ICAKY29uc3QgbGwgTElORiA9IDFlMTg7ICAKIApjb25zdCBpbnQgTiA9IDJlNSArIDU7IApjb25zdCBpbnQgUSA9IDJlNSArIDU7IAogCnN0cnVjdCBxdWVyeSB7CgljaGFyIHR5cGU7IAoJaW50IGEsIGI7IAp9OyAKIApzdHJ1Y3QgZmVud2ljayB7CglpbnQgbjsgIAoJdmVjdG9yPGludD4gZnQ7ICAKIAoJZmVud2ljayhpbnQgbikgOiBuKG4pIHsKCQlmdC5yZXNpemUobiwgMCk7IAoJfQkKIAoJdm9pZCB1cGRhdGUoaW50IHBvcywgaW50IHZhbCkgewoJCWZvciAoOyBwb3MgPCBuOyBwb3MgPSBwb3MgfCAocG9zICsgMSkpIGZ0W3Bvc10gKz0gdmFsOyAKCX0KCQoJaW50IGdldChpbnQgcG9zKSB7CgkJaW50IGFucyA9IDA7ICAKCQlmb3IgKDsgcG9zID49IDA7IHBvcyA9IChwb3MgJiAocG9zICsgMSkpIC0gMSkgYW5zICs9IGZ0W3Bvc107IAoJCXJldHVybiBhbnM7IAoJfQp9OyAKIAppbnQgbiwgcTsgIAppbnQgcFtOXTsKcXVlcnkgcXVlcmllc1tRXTsKIAppbnQgc3o7ICAKdmVjdG9yPGludD4gdmFsczsgLy8gZGFuaCBzw6FjaCBjw6FjIGdpw6EgdHLhu4sgY+G6p24gbsOpbgogCmludCBnZXRWYWwoaW50IHgpIHsKCXJldHVybiBsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIHgpIC0gdmFscy5iZWdpbigpOyAKfQogCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7ICAJCgljaW4gPj4gbiA+PiBxOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IHBbaV07IAoJCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHZhbHMucHVzaF9iYWNrKHBbaV0pOyAKIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKSB7CgkJY2hhciB0eXBlOyBjaW4gPj4gdHlwZTsgIAogCgkJaWYgKHR5cGUgPT0gJyEnKSB7CgkJCWludCBwb3MsIHg7IAoJCQljaW4gPj4gcG9zID4+IHg7ICAKCQkJdmFscy5wdXNoX2JhY2soeCk7IAoJCQlxdWVyaWVzW2ldID0ge3R5cGUsIHBvcywgeH07IAoJCX0KCQllbHNlIHsKCQkJaW50IGwsIHI7IAoJCQljaW4gPj4gbCA+PiByOyAKCQkJdmFscy5wdXNoX2JhY2sobCk7IHZhbHMucHVzaF9iYWNrKHIpOyAKCQkJcXVlcmllc1tpXSA9IHt0eXBlLCBsLCByfTsgCgkJfQoJfQkKIAoJc29ydCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpOyAKCXZhbHMucmVzaXplKHVuaXF1ZSh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpIC0gdmFscy5iZWdpbigpKTsgCglzeiA9IHZhbHMuc2l6ZSgpOyAgIAoKCWZlbndpY2sgQklUKHN6KTsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJcFtpXSA9IGdldFZhbChwW2ldKTsgCgkJQklULnVwZGF0ZShwW2ldLCAxKTsgCgl9CiAKCWZvciAoaW50IGkgPSAxOyBpIDw9IHE7IGkrKykgewoJCWNoYXIgdHlwZSA9IHF1ZXJpZXNbaV0udHlwZTsgCgkJCgkJaWYgKHR5cGUgPT0gJyEnKSB7CgkJCWludCBwb3MgPSBxdWVyaWVzW2ldLmEsIHggPSBxdWVyaWVzW2ldLmI7IAoJCQlCSVQudXBkYXRlKHBbcG9zXSwgLTEpOyAKCQkJcFtwb3NdID0gZ2V0VmFsKHgpOyAgIAoJCQlCSVQudXBkYXRlKHBbcG9zXSwgMSk7IAoJCX0KCQllbHNlIHsKCQkJaW50IGwgPSBxdWVyaWVzW2ldLmEsIHIgPSBxdWVyaWVzW2ldLmI7IAoJCQlsID0gZ2V0VmFsKGwpLCByID0gZ2V0VmFsKHIpOyAKCQkJaW50IGFucyA9IEJJVC5nZXQocikgLSBCSVQuZ2V0KGwgLSAxKTsgCgkJCWNvdXQgPDwgYW5zIDw8ICdcbic7IAoJCX0KCX0KfQo=