#include <bits/stdc++.h>
// #define int long long
using namespace std;
int lowbit(int x) {
return x & -x;
}
const int M = 1e7 + 10, N = 1e6 + 10;
set <int> arr[N];
int a[N], lhs[N], lhsq[N], root[N];
struct Node {
char opt;
int l, r;
} q[M];
auto findp(int i) {
return arr[a[i]].upper_bound(i);
}
int find(int i) {
return *findp(i);
}
auto Findp(int i) {
return arr[a[i]].lower_bound(i);
}
int Find(int i) {
return *Findp(i);
}
int n, m, cnt;
int z1[50], z2[50];
struct node {
int l, r;
int sum;
node () {
l = r = sum = 0;
}
} z[M];
void qwq() {
cout << "qwq\n";
}
int query(int ll, int rr) {
int l = 0, r = n;
int len1 = 0, len2 = 0;
for (int i = ll; i; i -= lowbit(i))
z1[++ len1] = root[i];
for (int i = rr; i; i -= lowbit(i))
z2[++ len2] = root[i];
// qwq();
int res = 0;
while (l < r) {
int mid = l + r >> 1;
if (rr <= mid) {
r = mid;
for (int i = 1; i <= len1; i ++)
res -= z[z[z1[i]].r].sum;
// qwq();
for (int i = 1; i <= len2; i ++)
res += z[z[z2[i]].r].sum;
// qwq();
for (int i = 1; i <= len1; i ++)
z1[i] = z[z1[i]].l;
// qwq();
for (int i = 1; i <= len2; i ++)
z2[i] = z[z2[i]].l;
// qwq();
} else {
l = mid + 1;
for (int i = 1; i <= len1; i ++)
z1[i] = z[z1[i]].r;
// qwq();
for (int i = 1; i <= len2; i ++)
z2[i] = z[z2[i]].r;
// qwq();
}
}
return res;
}
void modify(int &rt, int l, int r, int k, int c) {
int fa = rt;
if (!rt)
rt = ++ cnt;
z[rt].l = z[fa].l;
z[rt].r = z[fa].r;
z[rt].sum = z[fa].sum + c;
// cout << z[rt].l << ' ' << z[rt].r << ' ' << z[rt].sum << '\n';
if (l != r) {
int mid = l + r >> 1;
if (k <= mid)
modify(z[rt].l, l, mid, k, c);
else
modify(z[rt].r, mid + 1, r, k, c);
}
}
void modify(int x, int k, int c) {
for (int i = x; i <= n; i += lowbit(i))
modify(root[i], 0, n, k, c);
}
int nn;
int get(int x) {
int l = 1, r = nn;
while (l < r) {
int mid = l + r >> 1;
if (x <= lhs[mid])
r = mid;
else
l = mid + 1;
}
return l;
}
signed main() {
cin >> n >> m;
for (int i = 0; i < N; i ++)
arr[i].insert(0);
for (int i = 0; i < N; i ++)
arr[i].insert(n + 1);
for (int i = 1; i <= n; i ++)
cin >> a[i];
for (int i = 1; i <= m; i ++)
cin >> q[i].opt >> q[i].l >> q[i].r;
int tot = 0;
for (int i = 1; i <= n; i ++)
lhsq[++ tot] = a[i];
for (int i = 1; i <= m; i ++)
if (q[i].opt != 'Q')
lhsq[++ tot] = q[i].r;
sort (lhsq + 1, lhsq + tot + 1);
lhs[nn = 1] = lhsq[1];
for (int i = 2; i <= tot; i ++)
if (lhsq[i] != lhsq[i - 1])
lhs[++ nn] = lhsq[i];
for (int i = 1; i <= n; i ++)
a[i] = get(a[i]);
for (int i = 1; i <= n; i ++)
arr[a[i]].insert(i);
n ++;
for (int i = 1; i < n; i ++)
modify(i, find(i), 1);
for (int i = 1; i <= m; i ++) {
int l = q[i].l, r = q[i].r;
char &opt = q[i].opt;
if (opt == 'Q')
cout << query(l - 1, r) << '\n';
else {
auto p = prev(Findp(l));
int t = *p;
if (t) {
modify(t, l, -1);
modify(t, find(l), 1);
}
modify(l, find(l), -1);
arr[a[l]].erase(l);
a[l] = get(q[i].r);
arr[a[l]].insert(l);
p = prev(Findp(l));
t = *p;
if (t) {
modify(t, l, 1);
modify(t, find(l), -1);
}
modify(l, find(l), 1);
}
}
return 0;
}