#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
template<typename Key>
struct TreapNode {
Key key;
int priority, size;
TreapNode *left, *right;
TreapNode(const Key& k) : key(k), priority(rand()), size(1), left(nullptr), right(nullptr) {}
};
template<typename Key>
class Treap {
TreapNode<Key>* root = nullptr;
int getSize(TreapNode<Key>* t) {
return t ? t->size : 0;
}
void update(TreapNode<Key>* t) {
if (t) t->size = 1 + getSize(t->left) + getSize(t->right);
}
void split(TreapNode<Key>* t, const Key& key, TreapNode<Key>*& l, TreapNode<Key>*& r) {
if (!t) l = r = nullptr;
else if (key < t->key)
split(t->left, key, l, t->left), r = t;
else
split(t->right, key, t->right, r), l = t;
update(t);
}
TreapNode<Key>* merge(TreapNode<Key>* l, TreapNode<Key>* r) {
if (!l || !r) return l ? l : r;
if (l->priority > r->priority) {
l->right = merge(l->right, r);
update(l);
return l;
} else {
r->left = merge(l, r->left);
update(r);
return r;
}
}
void update_all(TreapNode<Key>* t) {
if (!t) return;
update_all(t->left);
update_all(t->right);
update(t);
}
public:
void insert (TreapNode<Key>* & t, TreapNode<Key>* it) {
if (!t) {t = it; return;}
if (it->priority > t->priority)
split (t, it->key, it->left, it->right), t = it;
else
insert (t->key <= it->key ? t->right : t->left, it);
update(t);
}
void insert(const Key& key) {
insert(root, new TreapNode<Key>(key));
}
/*
void insert(const Key& key) {
TreapNode<Key> *l, *r;
split(root, key, l, r);
root = merge(merge(l, new TreapNode<Key>(key)), r);
}*/
TreapNode<Key>* erase(TreapNode<Key>* t, const Key& key) {
if (!t) return nullptr;
if (key == t->key)
return merge(t->left, t->right);
else if (key < t->key)
t->left = erase(t->left, key);
else
t->right = erase(t->right, key);
update(t);
return t;
}
void erase(const Key& key) {
root = erase(root,key);
}
int count_less_equal(const Key& key) {
TreapNode<Key> *cur = root;
int ans = 0;
while(cur){
if(key>=cur->key) ans+=1+getSize(cur->left), cur = cur->right;
else cur = cur->left;
}
return ans;
}
void build(const vector<Key>& sorted_keys) {
stack<TreapNode<Key>*> stk;
for (const auto& key : sorted_keys) {
TreapNode<Key>* cur = new TreapNode<Key>(key);
TreapNode<Key>* last = nullptr;
while (!stk.empty() && stk.top()->priority < cur->priority) {
last = stk.top();
stk.pop();
}
if (!stk.empty()) stk.top()->right = cur;
cur->left = last;
stk.push(cur);
}
// Root is bottom of stack
while (stk.size() > 1) stk.pop();
root = stk.top();
update_all(root);
}
};
const int N = 100001;
Treap<pair<int,int>> bit[N];
void insert(int x, int y)
{
for(int i = x; i < N; i += i & -i)
bit[i].insert({y, x});
}
void remove(int x, int y)
{
for(int i = x; i < N; i += i & -i)
bit[i].erase({y, x});
}
int query(int x, int y)
{
int ans = 0;
for(int i = x; i > 0; i -= i & -i){
ans += bit[i].count_less_equal({y+1, 0});
}
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,q;
cin>>n>>q;
vector<int> arr(n+1);
vector<vector<pair<int,int>>> sorted_keys(N);
for(int i=1;i<=n;++i){
cin>>arr[i];
//insert(i,arr[i]);
for(int j = i; j < N; j += j & -j)
sorted_keys[j].emplace_back(i, arr[i]);
}
for(int i=1;i<=n;++i){
for(auto x: sorted_keys[i])
bit[i].insert(x);
}
while(q--){
string op;
cin>>op;
if(op=="M"){
int i,x;
cin>>i>>x;
remove(i,arr[i]);
insert(i,x);
arr[i]=x;
}else{
int p,q,x;
cin>>p>>q>>x;
cout<<query(q,x)-query(p-1,x)<<endl;
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZW5kbCAnXG4nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBLZXk+CnN0cnVjdCBUcmVhcE5vZGUgewogICAgS2V5IGtleTsKICAgIGludCBwcmlvcml0eSwgc2l6ZTsKICAgIFRyZWFwTm9kZSAqbGVmdCwgKnJpZ2h0OwogICAgVHJlYXBOb2RlKGNvbnN0IEtleSYgaykgOiBrZXkoayksIHByaW9yaXR5KHJhbmQoKSksIHNpemUoMSksIGxlZnQobnVsbHB0ciksIHJpZ2h0KG51bGxwdHIpIHt9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBLZXk+CmNsYXNzIFRyZWFwIHsKICAgIFRyZWFwTm9kZTxLZXk+KiByb290ID0gbnVsbHB0cjsKCiAgICBpbnQgZ2V0U2l6ZShUcmVhcE5vZGU8S2V5PiogdCkgewogICAgICAgIHJldHVybiB0ID8gdC0+c2l6ZSA6IDA7CiAgICB9CgogICAgdm9pZCB1cGRhdGUoVHJlYXBOb2RlPEtleT4qIHQpIHsKICAgICAgICBpZiAodCkgdC0+c2l6ZSA9IDEgKyBnZXRTaXplKHQtPmxlZnQpICsgZ2V0U2l6ZSh0LT5yaWdodCk7CiAgICB9CgogICAgdm9pZCBzcGxpdChUcmVhcE5vZGU8S2V5PiogdCwgY29uc3QgS2V5JiBrZXksIFRyZWFwTm9kZTxLZXk+KiYgbCwgVHJlYXBOb2RlPEtleT4qJiByKSB7CiAgICAgICAgaWYgKCF0KSBsID0gciA9IG51bGxwdHI7CiAgICAgICAgZWxzZSBpZiAoa2V5IDwgdC0+a2V5KQogICAgICAgICAgICBzcGxpdCh0LT5sZWZ0LCBrZXksIGwsIHQtPmxlZnQpLCByID0gdDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNwbGl0KHQtPnJpZ2h0LCBrZXksIHQtPnJpZ2h0LCByKSwgbCA9IHQ7CiAgICAgICAgdXBkYXRlKHQpOwogICAgfQoKICAgIFRyZWFwTm9kZTxLZXk+KiBtZXJnZShUcmVhcE5vZGU8S2V5PiogbCwgVHJlYXBOb2RlPEtleT4qIHIpIHsKICAgICAgICBpZiAoIWwgfHwgIXIpIHJldHVybiBsID8gbCA6IHI7CiAgICAgICAgaWYgKGwtPnByaW9yaXR5ID4gci0+cHJpb3JpdHkpIHsKICAgICAgICAgICAgbC0+cmlnaHQgPSBtZXJnZShsLT5yaWdodCwgcik7CiAgICAgICAgICAgIHVwZGF0ZShsKTsKICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgci0+bGVmdCA9IG1lcmdlKGwsIHItPmxlZnQpOwogICAgICAgICAgICB1cGRhdGUocik7CiAgICAgICAgICAgIHJldHVybiByOwogICAgICAgIH0KICAgIH0KICAgIHZvaWQgdXBkYXRlX2FsbChUcmVhcE5vZGU8S2V5PiogdCkgewogICAgICAgIGlmICghdCkgcmV0dXJuOwogICAgICAgIHVwZGF0ZV9hbGwodC0+bGVmdCk7CiAgICAgICAgdXBkYXRlX2FsbCh0LT5yaWdodCk7CiAgICAgICAgdXBkYXRlKHQpOwogICAgfQoKcHVibGljOgogICAgdm9pZCBpbnNlcnQgKFRyZWFwTm9kZTxLZXk+KiAmIHQsIFRyZWFwTm9kZTxLZXk+KiBpdCkgewoJICAgIGlmICghdCkge3QgPSBpdDsgcmV0dXJuO30KCSAgICBpZiAoaXQtPnByaW9yaXR5ID4gdC0+cHJpb3JpdHkpCgkgICAgICAgIHNwbGl0ICh0LCBpdC0+a2V5LCBpdC0+bGVmdCwgaXQtPnJpZ2h0KSwgIHQgPSBpdDsKCSAgICBlbHNlCgkgICAgICAgIGluc2VydCAodC0+a2V5IDw9IGl0LT5rZXkgPyB0LT5yaWdodCA6IHQtPmxlZnQsIGl0KTsKCSAgICB1cGRhdGUodCk7Cgl9Cgl2b2lkIGluc2VydChjb25zdCBLZXkmIGtleSkgewogICAgICAgIGluc2VydChyb290LCBuZXcgVHJlYXBOb2RlPEtleT4oa2V5KSk7CiAgICB9CgkvKgogICAgdm9pZCBpbnNlcnQoY29uc3QgS2V5JiBrZXkpIHsKICAgICAgICBUcmVhcE5vZGU8S2V5PiAqbCwgKnI7CiAgICAgICAgc3BsaXQocm9vdCwga2V5LCBsLCByKTsKICAgICAgICByb290ID0gbWVyZ2UobWVyZ2UobCwgbmV3IFRyZWFwTm9kZTxLZXk+KGtleSkpLCByKTsKICAgIH0qLwogICAgCiAgICBUcmVhcE5vZGU8S2V5PiogZXJhc2UoVHJlYXBOb2RlPEtleT4qIHQsIGNvbnN0IEtleSYga2V5KSB7CgkgICAgaWYgKCF0KSByZXR1cm4gbnVsbHB0cjsKCSAgICBpZiAoa2V5ID09IHQtPmtleSkKCSAgICAgICAgcmV0dXJuIG1lcmdlKHQtPmxlZnQsIHQtPnJpZ2h0KTsKCSAgICBlbHNlIGlmIChrZXkgPCB0LT5rZXkpCgkgICAgICAgIHQtPmxlZnQgPSBlcmFzZSh0LT5sZWZ0LCBrZXkpOwoJICAgIGVsc2UKCSAgICAgICAgdC0+cmlnaHQgPSBlcmFzZSh0LT5yaWdodCwga2V5KTsKCSAgICB1cGRhdGUodCk7CgkgICAgcmV0dXJuIHQ7Cgl9CgogICAgdm9pZCBlcmFzZShjb25zdCBLZXkmIGtleSkgewogICAgCXJvb3QgPSBlcmFzZShyb290LGtleSk7CiAgICB9CgogICAgaW50IGNvdW50X2xlc3NfZXF1YWwoY29uc3QgS2V5JiBrZXkpIHsKICAgICAgICBUcmVhcE5vZGU8S2V5PiAqY3VyID0gcm9vdDsKICAgICAgICBpbnQgYW5zID0gMDsKICAgICAgICB3aGlsZShjdXIpewogICAgICAgIAlpZihrZXk+PWN1ci0+a2V5KSBhbnMrPTErZ2V0U2l6ZShjdXItPmxlZnQpLCBjdXIgPSBjdXItPnJpZ2h0OwogICAgICAgIAllbHNlIGN1ciA9IGN1ci0+bGVmdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KICAgIAogICAgdm9pZCBidWlsZChjb25zdCB2ZWN0b3I8S2V5PiYgc29ydGVkX2tleXMpIHsKICAgICAgICBzdGFjazxUcmVhcE5vZGU8S2V5Pio+IHN0azsKICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGtleSA6IHNvcnRlZF9rZXlzKSB7CiAgICAgICAgICAgIFRyZWFwTm9kZTxLZXk+KiBjdXIgPSBuZXcgVHJlYXBOb2RlPEtleT4oa2V5KTsKICAgICAgICAgICAgVHJlYXBOb2RlPEtleT4qIGxhc3QgPSBudWxscHRyOwoKICAgICAgICAgICAgd2hpbGUgKCFzdGsuZW1wdHkoKSAmJiBzdGsudG9wKCktPnByaW9yaXR5IDwgY3VyLT5wcmlvcml0eSkgewogICAgICAgICAgICAgICAgbGFzdCA9IHN0ay50b3AoKTsKICAgICAgICAgICAgICAgIHN0ay5wb3AoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzdGsuZW1wdHkoKSkgc3RrLnRvcCgpLT5yaWdodCA9IGN1cjsKICAgICAgICAgICAgY3VyLT5sZWZ0ID0gbGFzdDsKICAgICAgICAgICAgc3RrLnB1c2goY3VyKTsKICAgICAgICB9CgogICAgICAgIC8vIFJvb3QgaXMgYm90dG9tIG9mIHN0YWNrCiAgICAgICAgd2hpbGUgKHN0ay5zaXplKCkgPiAxKSBzdGsucG9wKCk7CiAgICAgICAgcm9vdCA9IHN0ay50b3AoKTsKCiAgICAgICAgdXBkYXRlX2FsbChyb290KTsKICAgIH0KfTsKCgpjb25zdCBpbnQgTiA9IDEwMDAwMTsKClRyZWFwPHBhaXI8aW50LGludD4+IGJpdFtOXTsKCnZvaWQgaW5zZXJ0KGludCB4LCBpbnQgeSkKewoJZm9yKGludCBpID0geDsgaSA8IE47IGkgKz0gaSAmIC1pKQoJCWJpdFtpXS5pbnNlcnQoe3ksIHh9KTsKfQoKdm9pZCByZW1vdmUoaW50IHgsIGludCB5KQp7Cglmb3IoaW50IGkgPSB4OyBpIDwgTjsgaSArPSBpICYgLWkpCgkJYml0W2ldLmVyYXNlKHt5LCB4fSk7Cn0KCmludCBxdWVyeShpbnQgeCwgaW50IHkpCnsKCWludCBhbnMgPSAwOwoJZm9yKGludCBpID0geDsgaSA+IDA7IGkgLT0gaSAmIC1pKXsKCQlhbnMgKz0gYml0W2ldLmNvdW50X2xlc3NfZXF1YWwoe3krMSwgMH0pOwoJfQoJcmV0dXJuIGFuczsKfQoKCmludCBtYWluKCl7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgljaW4udGllKDApOwoJaW50IG4scTsKCWNpbj4+bj4+cTsKCXZlY3RvcjxpbnQ+IGFycihuKzEpOwoJdmVjdG9yPHZlY3RvcjxwYWlyPGludCxpbnQ+Pj4gc29ydGVkX2tleXMoTik7Cglmb3IoaW50IGk9MTtpPD1uOysraSl7CgkJY2luPj5hcnJbaV07CgkJLy9pbnNlcnQoaSxhcnJbaV0pOwoJCWZvcihpbnQgaiA9IGk7IGogPCBOOyBqICs9IGogJiAtaikKCQkJc29ydGVkX2tleXNbal0uZW1wbGFjZV9iYWNrKGksIGFycltpXSk7Cgl9Cglmb3IoaW50IGk9MTtpPD1uOysraSl7CgkJZm9yKGF1dG8geDogc29ydGVkX2tleXNbaV0pCgkJCWJpdFtpXS5pbnNlcnQoeCk7Cgl9Cgl3aGlsZShxLS0pewoJCXN0cmluZyBvcDsKCQljaW4+Pm9wOwoJCWlmKG9wPT0iTSIpewoJCQlpbnQgaSx4OwoJCQljaW4+Pmk+Png7CgkJCXJlbW92ZShpLGFycltpXSk7CgkJCWluc2VydChpLHgpOwoJCQlhcnJbaV09eDsKCQl9ZWxzZXsKCQkJaW50IHAscSx4OwoJCQljaW4+PnA+PnE+Png7CgkJCWNvdXQ8PHF1ZXJ5KHEseCktcXVlcnkocC0xLHgpPDxlbmRsOwoJCX0KCX0KfQ==