Link to this code:
https://cses.fi/paste/4157a6d49bec6616e549ff/#include<bits/stdc++.h>
using namespace std;
#define all(v) ((v).begin()), ((v).end())
#define sz(v) (int)((v).size())
#define IOS ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#ifndef ONLINE_JUDGE
#include "debug.cpp"
#else
#define debug(...)
#endif
const int MAX_N = 2e5 + 5;
#define lc (2 * id + 1)
#define rc (2 * id + 2)
int n, q, t[MAX_N << 2], a[MAX_N], nxt[MAX_N];
void build(int id = 0, int l = 0, int r = n - 1){
if(l == r){
t[id] = nxt[l];
return;
}
int m = (l + r) >> 1;
build(lc, l, m);
build(rc, m + 1, r);
t[id] = min(t[lc], t[rc]);
}
void update(int p, int v, int id = 0, int l = 0, int r = n - 1){
if(l == r){
t[id] = v;
return;
}
int m = (l + r) >> 1;
if(p <= m) update(p, v, lc, l, m);
else update(p, v, rc, m + 1, r);
t[id] = min(t[lc], t[rc]);
}
int get(int lq, int rq, int id = 0, int l = 0, int r = n - 1){
if(r < lq || rq < l) return n;
if(lq <= l && r <= rq) return t[id];
int m = (l + r) >> 1;
return min(get(lq, rq, lc, l, m), get(lq, rq, rc, m + 1, r));
}
void Heisenberg(){
cin >> n >> q;
unordered_map<int, vector<int>> posVec;
unordered_map<int, set<int>> pos;
for(int i = 0; i < n; ++i){
cin >> a[i];
nxt[i] = n;
if(!posVec[a[i]].empty()) nxt[posVec[a[i]].back()] = i;
posVec[a[i]].push_back(i);
pos[a[i]].insert(i);
}
build();
while(q--){
int t; cin >> t;
if(t == 1){
int k, u; cin >> k >> u;
k--;
if(a[k] == u) continue;
auto it = pos[a[k]].find(k);
if(it != pos[a[k]].begin()){
nxt[*--it] = nxt[k];
update(*it, nxt[*it]);
}
pos[a[k]].erase(k);
it = pos[u].upper_bound(k);
nxt[k] = (it == pos[u].end() ? n : *it);
update(k, nxt[k]);
if(it != pos[u].begin()){
nxt[*--it] = k;
update(*it, nxt[*it]);
}
pos[u].insert(k);
a[k] = u;
}
else{
int l, r; cin >> l >> r;
l--, r--;
if(get(l, r) > r) cout << "YES\n";
else cout << "NO\n";
}
}
}
signed main(){
IOS
Heisenberg();
}