#include <bits/stdc++.h>
#define N 300005
#define ll long long
using namespace std;
int n,m,tot,opcnt,qcnt,B,now;
int a[N],A[N],output[N],cnt[N],mex[N];
struct query
{
int l,r,id,t;
bool operator<(query b) const
{
return l/B==b.l/B?(r/B==b.r/B?t<b.t:r<b.r):l<b.l;
}
} q[N];
struct change
{
int p,x;
} c[N];
void add(int num)
{
--mex[cnt[num]];
++mex[++cnt[num]];
}
void del(int num)
{
--mex[cnt[num]];
++mex[--cnt[num]];
}
void update(int id,int t)
{
if(c[t].p>=q[id].l&&c[t].p<=q[id].r)
{
del(a[c[t].p]);
add(c[t].x);
}
swap(c[t].x, a[c[t].p]);
}
int getans()
{
int i;
for(i=1; mex[i]>0; ++i);
return i;
}
int main()
{
int l=2,r=1;
scanf("%d%d",&n,&m);
B=pow(n,0.6666);
for(int i=1; i<=n; ++i)
{
scanf("%d",&a[i]);
A[++tot]=a[i];
}
for(int i=1; i<=m; ++i)
{
int op,a,b;
scanf("%d%d%d",&op,&a,&b);
if(op==1)
{
++qcnt;
q[qcnt]={a,b};
q[qcnt].id=qcnt;
q[qcnt].t=opcnt;
}
else
{
++opcnt;
c[opcnt]={a,b};
A[++tot]=b;
}
}
sort(A+1,A+1+tot);
for(int i=1; i<=n; ++i)
a[i]=lower_bound(A+1,A+1+tot,a[i])-A;
for(int i=1; i<=opcnt; ++i)
c[i].x=lower_bound(A+1,A+1+tot,c[i].x)-A;
sort(q+1,q+1+qcnt);
for(int i=1; i<=qcnt; ++i)
{
while(l>q[i].l) add(a[--l]);
while(r<q[i].r) add(a[++r]);
while(l<q[i].l) del(a[l++]);
while(r>q[i].r) del(a[r--]);
while(now<q[i].t) update(i, ++now);
while(now>q[i].t) update(i, now--);
output[q[i].id]=getans();
}
for(int i=1; i<=qcnt; ++i)
printf("%d\n",output[i]);
return 0;
}