rt
TLE+WA 求求大佬
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e6 + 10;
const int V = 4e6 + 10;
int cnt[V], w[N], ans[N];
int n, m, cntq, cntr, cur, siz;
struct node {
int l, r, t, id;
bool operator<(const node& o) const {
if (l / siz == o.l / siz) {
if (r / siz == o.r / siz)
return t < o.t;
return r < o.r;
}
return l < o.l;
}
} qry[N], qr[N];
inline int read() {
int f = 1, s = 0;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
s = s * 10 + c - '0';
c = getchar();
}
return f * s;
}
inline void add(int v) {
if (cnt[v] == 0)
cur++;
cnt[v]++;
}
inline void del(int v) {
cnt[v]--;
if (cnt[v] == 0)
cur--;
}
inline void update(int v, int t) {
if (qry[v].l <= qr[t].l && qr[t].l <= qry[v].r) {
del(w[qr[t].l]);
add(qr[t].r);
}
swap(w[qr[t].l], qr[t].r);
}
int main() {
n = read();
m = read();
siz = sqrt(n);
for (int i = 1; i <= n; ++i)
w[i] = read();
for (int i = 1; i <= m; ++i) {
char x; scanf("%c ", &x);
int l, r; l = read(), r = read();
if (x == 'Q') {
qry[++cntq].l = l;
qry[cntq].r = r;
qry[cntq].t = cntr;
qry[cntq].id = cntq;
} else {
qr[++cntr].l = l;
qr[cntr].r = r;
}
}
sort(qry + 1, qry + cntq + 1);
LL l = 1, r = 0, t = 0;
for (LL i = 1; i <= cntq; ++i) {
while (l < qry[i].l) del(w[l++]);
while (l > qry[i].l) add(w[--l]);
while (r < qry[i].r) add(w[++r]);
while (r > qry[i].r) del(w[r--]);
while (t < qry[i].t) update(i, ++t);
while (t > qry[i].t) update(i, t--);
ans[qry[i].id] = cur;
}
for (int i = 1; i <= cntq; ++i)
printf("%d\n", ans[i]);
return 0;
}