#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n, m, pen[maxn];
struct op{ // 询问结构
int l, r, id, t;
}ops[maxn];
struct fix{ // 修改结构
int pos, color;
}fixs[maxn];
int part; // 分块大小
int op_num, fix_num; // 询问数目 修改数目
int sum, cnt[maxn]; // 转移过程
int ans[maxn]; // 答案数组
inline int cmp(op p1, op p2){ // 莫队排序
if(p1.l / part != p2.l / part)return p1.l / part < p2.l / part;
if(p1.r / part != p2.r / part)return p1.r / part < p2.r / part;
return p1.t < p2.t;
}
void add(int color){
if(!cnt[color])++sum;
++cnt[color];
}
void del(int color){
--cnt[color];
if(!cnt[color])--sum;
}
void update(int op, int t){ // 修改
if(ops[op].l <= fixs[t].pos && ops[op].r >= fixs[t].pos){
del(pen[fixs[t].pos]);
add(fixs[t].color);
}
swap(fixs[t].color, pen[fixs[t].pos]);
}
int main(){
cin >> n >> m; part = sqrt(n);
for(int i = 1; i <= n; ++i)cin >> pen[i];
for(int i = 1; i <= m; ++i){
char x; cin >> x;
if(x == 'Q')++op_num, cin >> ops[op_num].l >> ops[op_num].r, ops[op_num].id = op_num, ops[op_num].t = fix_num;
else ++fix_num, cin >> fixs[fix_num].pos >> fixs[fix_num].color;
}
sort(ops + 1, ops + op_num + 1, cmp);
int l = 1, r = 0, t = 0;
for(int i = 1; i <= op_num; ++i){
while(ops[i].l < l)add(pen[--l]);
while(ops[i].r > r)add(pen[++r]);
while(ops[i].l > l)del(pen[l++]);
while(ops[i].r < r)del(pen[r--]);
while(ops[i].t > t)update(i, ++t);
while(ops[i].t < t)update(i, t--);
ans[ops[i].id] = sum;
}
for(int i = 1; i <= op_num; ++i)cout << ans[i] << endl;
return 0;
}