#include <bits/stdc++.h>
using namespace std;
const int N = 140000;
const int M = 140000;
const int V = 1000000 + 10;
struct Qry {
int l, r, t, id;
};
struct Edt {
int p, oldc, newc;
};
int a[N];
int cnt[V];
Qry qry[M];
Edt edt[M];
int ans[M];
int res, sz;
bool operator < (const Qry& a, const Qry& b) {
if (a.l / sz != b.l / sz) return a.l / sz < b.l / sz;
if (a.r / sz != b.r / sz) return a.r / sz < b.r / sz;
return a.t < b.t;
}
void update(int i, int d) {
cnt[a[i]] += d;
if (d == -1 && cnt[a[i]] == 0) res --;
else if (d == 1 && cnt[a[i]] == 1) res ++;
}
void change(int i, int c, int l, int r) {
if (i >= l && i <= r) {
update(i, -1);
a[i] = c;
update(i, 1);
}
else a[i] = c;
}
int main() {
int n, m, tq = 0, te = 0, l, r, t, p, c;
char op;
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++) scanf("%d", &a[i]);
for (int i=0; i<m; i++) {
scanf(" %c", &op);
if (op == 'Q') {
scanf("%d %d", &qry[tq].l, &qry[tq].r);
qry[tq].id = tq;
qry[tq].t = te;
tq ++;
}
else {
scanf("%d %d", &p, &c);
edt[te] = {p, a[p], c};
a[p] = c;
te ++;
}
}
for (int i=te-1; i>=0; i--) a[edt[i].p] = edt[i].oldc;
sz = pow(n, 2.0 / 3);
///*if (te == 0) sz = sqrt(tq); else*/ sz = ceil(exp((log(n)+log(te))/3));//pow((double)tq * te, 1.0 / 3);
sort(qry, qry + tq);
l = qry[0].l, r = qry[0].r, t = qry[0].t;
for (int i=l; i<=r; i++) update(i, 1);
for (int i=0; i<t; i++) change(edt[i].p, edt[i].newc, l, r);
ans[qry[0].id] = res;
for (int i=1; i<tq; i++) {
while (l > qry[i].l) update(-- l, 1);
while (r < qry[i].r) update(++ r, 1);
while (l < qry[i].l) update(l ++, -1);
while (r > qry[i].r) update(r --, -1);
while (t < qry[i].t) {
change(edt[t].p, edt[t].newc, l, r);
t ++;
}
while (t > qry[i].t) {
t --;
change(edt[t].p, edt[t].oldc, l, r);
}
ans[qry[i].id] = res;
}
for (int i=0; i<tq; i++) printf("%d\n", ans[i]);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE4gPSAxNDAwMDA7CmNvbnN0IGludCBNID0gMTQwMDAwOwpjb25zdCBpbnQgViA9IDEwMDAwMDAgKyAxMDsKCnN0cnVjdCBRcnkgewoJaW50IGwsIHIsIHQsIGlkOwp9OwoKc3RydWN0IEVkdCB7CglpbnQgcCwgb2xkYywgbmV3YzsKfTsKCmludCBhW05dOwppbnQgY250W1ZdOwpRcnkgcXJ5W01dOwpFZHQgZWR0W01dOwppbnQgYW5zW01dOwppbnQgcmVzLCBzejsKCmJvb2wgb3BlcmF0b3IgPCAoY29uc3QgUXJ5JiBhLCBjb25zdCBRcnkmIGIpIHsKCWlmIChhLmwgLyBzeiAhPSBiLmwgLyBzeikgcmV0dXJuIGEubCAvIHN6IDwgYi5sIC8gc3o7CglpZiAoYS5yIC8gc3ogIT0gYi5yIC8gc3opIHJldHVybiBhLnIgLyBzeiA8IGIuciAvIHN6OwoJcmV0dXJuIGEudCA8IGIudDsKfQoKdm9pZCB1cGRhdGUoaW50IGksIGludCBkKSB7CgljbnRbYVtpXV0gKz0gZDsKCWlmIChkID09IC0xICYmIGNudFthW2ldXSA9PSAwKSByZXMgLS07CgllbHNlIGlmIChkID09IDEgJiYgY250W2FbaV1dID09IDEpIHJlcyArKzsKfQoKdm9pZCBjaGFuZ2UoaW50IGksIGludCBjLCBpbnQgbCwgaW50IHIpIHsKCWlmIChpID49IGwgJiYgaSA8PSByKSB7CgkJdXBkYXRlKGksIC0xKTsKCQlhW2ldID0gYzsKCQl1cGRhdGUoaSwgMSk7Cgl9CgllbHNlIGFbaV0gPSBjOwp9CgppbnQgbWFpbigpIHsKCWludCBuLCBtLCB0cSA9IDAsIHRlID0gMCwgbCwgciwgdCwgcCwgYzsKCWNoYXIgb3A7CglzY2FuZigiJWQgJWQiLCAmbiwgJm0pOwoJZm9yIChpbnQgaT0xOyBpPD1uOyBpKyspIHNjYW5mKCIlZCIsICZhW2ldKTsKCWZvciAoaW50IGk9MDsgaTxtOyBpKyspIHsKCQlzY2FuZigiICVjIiwgJm9wKTsKCQlpZiAob3AgPT0gJ1EnKSB7CgkJCXNjYW5mKCIlZCAlZCIsICZxcnlbdHFdLmwsICZxcnlbdHFdLnIpOwoJCQlxcnlbdHFdLmlkID0gdHE7CgkJCXFyeVt0cV0udCA9IHRlOwoJCQl0cSArKzsKCQl9CgkJZWxzZSB7CgkJCXNjYW5mKCIlZCAlZCIsICZwLCAmYyk7CgkJCWVkdFt0ZV0gPSB7cCwgYVtwXSwgY307CgkJCWFbcF0gPSBjOwoJCQl0ZSArKzsKCQl9Cgl9Cglmb3IgKGludCBpPXRlLTE7IGk+PTA7IGktLSkgYVtlZHRbaV0ucF0gPSBlZHRbaV0ub2xkYzsKCXN6ID0gcG93KG4sIDIuMCAvIDMpOwoJLy8vKmlmICh0ZSA9PSAwKSBzeiA9IHNxcnQodHEpOyBlbHNlKi8gc3ogPSBjZWlsKGV4cCgobG9nKG4pK2xvZyh0ZSkpLzMpKTsvL3BvdygoZG91YmxlKXRxICogdGUsIDEuMCAvIDMpOwoJc29ydChxcnksIHFyeSArIHRxKTsKCWwgPSBxcnlbMF0ubCwgciA9IHFyeVswXS5yLCB0ID0gcXJ5WzBdLnQ7Cglmb3IgKGludCBpPWw7IGk8PXI7IGkrKykgdXBkYXRlKGksIDEpOwoJZm9yIChpbnQgaT0wOyBpPHQ7IGkrKykgY2hhbmdlKGVkdFtpXS5wLCBlZHRbaV0ubmV3YywgbCwgcik7CglhbnNbcXJ5WzBdLmlkXSA9IHJlczsKCWZvciAoaW50IGk9MTsgaTx0cTsgaSsrKSB7CgkJd2hpbGUgKGwgPiBxcnlbaV0ubCkgdXBkYXRlKC0tIGwsIDEpOwoJCXdoaWxlIChyIDwgcXJ5W2ldLnIpIHVwZGF0ZSgrKyByLCAxKTsKCQl3aGlsZSAobCA8IHFyeVtpXS5sKSB1cGRhdGUobCArKywgLTEpOwoJCXdoaWxlIChyID4gcXJ5W2ldLnIpIHVwZGF0ZShyIC0tLCAtMSk7CgkJd2hpbGUgKHQgPCBxcnlbaV0udCkgewoJCQljaGFuZ2UoZWR0W3RdLnAsIGVkdFt0XS5uZXdjLCBsLCByKTsKCQkJdCArKzsKCQl9CgkJd2hpbGUgKHQgPiBxcnlbaV0udCkgewoJCQl0IC0tOwoJCQljaGFuZ2UoZWR0W3RdLnAsIGVkdFt0XS5vbGRjLCBsLCByKTsKCQl9CgkJYW5zW3FyeVtpXS5pZF0gPSByZXM7Cgl9Cglmb3IgKGludCBpPTA7IGk8dHE7IGkrKykgcHJpbnRmKCIlZFxuIiwgYW5zW2ldKTsKCXJldHVybiAwOwp9