vector<int> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; }
vector<Query> que(q); for (int i = 0; i < q; i++) { int l, r; cin >> l >> r; que[i] = { l, r, i }; }
int len = sqrt(n); ranges::sort(que, [&](const Query& p, const Query& q) { int as = (p.l - 1) / len + 1; int bs = (q.l - 1) / len + 1; if (as != bs) return as < bs; elsereturn p.r < q.r; });
int cur = 0; vector<int> cnt(1e6); auto add = [&](int pos) -> void { cnt[a[pos]]++; if (cnt[a[pos]] == 1) { cur++; } };
auto del = [&](int pos) -> void { cnt[a[pos]]--; if (cnt[a[pos]] == 0) { cur--; } };
int nowr = 0, nowl = 1;
vector<int> ans(q); for (auto &x : que) { auto [l, r, id] = x;
while (nowr < r) { nowr++; add(nowr); } while (nowr > r) { del(nowr); nowr--; } while (nowl < l) { del(nowl); nowl++; } while (nowl > l) { nowl--; add(nowl); }
if (cur == r - l + 1) { ans[id] = 1; } else { ans[id] = 0; } }
for (int i = 0; i < q; i++) { if (ans[i]) { cout << "Yes\n"; } else { cout << "No\n"; } } return0; }
#include<bits/stdc++.h> usingnamespace std; using i64 = longlong; structQuery { int l, r, t, id; };
structModify { int pos, p, v; }; constint SIZ = 1e6 + 7; intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr);
int n, m; cin >> n >> m;
vector<int> a0(n + 1); for (int i = 1; i <= n; i++) { cin >> a0[i]; }
vector<int> a(a0); vector<Query> que; vector<Modify> mo; int curt = 0;
for (int i = 0; i < m; i++) { char u; int l, r; cin >> u >> l >> r; if (u == 'Q') { que.emplace_back(l, r, curt, (int)que.size()); } else { mo.emplace_back(l, a0[l], r); a0[l] = r; curt++; } }
int len = pow(n, 2.0 / 3); // 块长, 一般取(m^1/3)或者 (n^2/3);
ranges::sort(que, [&](const Query& p, const Query& q) { int as = (p.l - 1) / len + 1, bs = (q.l - 1) / len + 1; if (as != bs) return as < bs; int ra = (p.r - 1) / len + 1, rb = (q.r - 1) / len + 1; if (ra != rb) return ra < rb; return p.t < q.t; });
vector<int> cnt(SIZ); int cur = 0; int curl = 1, curr = 0; curt = 0; auto add = [&](int pos) -> void { cnt[a[pos]]++; if (cnt[a[pos]] == 1) { cur++; } };
auto del = [&](int pos) -> void { cnt[a[pos]]--; if (cnt[a[pos]] == 0) { cur--; } };
auto apply = [&](int t) -> void { int pos = mo[t].pos; if (curl <= pos && pos <= curr) { del(pos); } a[pos] = mo[t].v; if (curl <= pos && pos <= curr) { add(pos); } };
auto roll = [&](int t) -> void { int pos = mo[t].pos; if (curl <= pos && pos <= curr) { del(pos); } a[pos] = mo[t].p; if (curl <= pos && pos <= curr) { add(pos); } };
vector<int> ans(que.size()); for (auto q : que) { auto [l, r, t, id] = q;
while (curt < t) { apply(curt); curt++; } while (curt > t) { curt--; roll(curt); }
while (curr < r) { curr++; add(curr); } while (curr > r) { del(curr); curr--; } while (curl < l) { del(curl); curl++; } while (curl > l) { curl--; add(curl); } ans[id] = cur; }
for (auto x : ans) { cout << x << '\n'; } return0; }