#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5,blk=666;
struct node {
int l,r,t,b1,b2,id;
node() {}
node(int L,int R,int T,int i) {
l=L,r=R,t=T,id=i;
b1=l/blk,b2=r/blk;
}
friend bool operator<(node a,node b) {
if(a.b1!=b.b1)return a.b1<b.b1;
if(a.b2!=b.b2)return a.b2<b.b2;
return a.t<b.t;
}
} p[maxn];
struct chnode {
int x,y,pre;
chnode() {}
chnode(int X,int Y,int p) {
x=X,y=Y,pre=p;
}
} q[maxn];
int n,m,a[maxn],pre[maxn],cnt[maxn],sum[maxn],qc,ac,ans,l=1,r;
void revise(int x,bool v) {
if(v) {
if(!cnt[x])ans++;
if(cnt[x]==1)ans--;
cnt[x]++;
} else {
if(cnt[x]==1)ans--;
if(cnt[x]==2)ans++;
cnt[x]--;
}
}
void change(int x,int c) {
if(x>=l&&x<=r)revise(a[x],0),revise(a[x]=c,1);
else a[x]=c;
}
void md(int i) {
for(register int j=p[i-1].t+1; j<=p[i].t; j++)change(q[j].x,q[j].y);
for(register int j=p[i-1].t; j>=p[i].t+1; j--)change(q[j].x,q[j].pre);
while(l>p[i].l)revise(a[--l],1);
while(r<p[i].r)revise(a[++r],1);
while(l<p[i].l)revise(a[l++],0);
while(r>p[i].r)revise(a[r--],0);
sum[p[i].id]=ans;
}
int main() {
int op,x,y;
scanf("%d%d",&n,&m);
for(register int i=1; i<=n; i++)scanf("%d",&a[i]),pre[i]=a[i];
for(register int i=1; i<=m; i++) {
scanf("%d%d%d",&op,&x,&y);
if(op==1)q[++ac]=chnode(x+1,y,pre[x]),pre[x]=y;
else qc++,p[qc]=node(x+1,y+1,ac,qc);
}
sort(p+1,p+qc+1);
for(register int i=1; i<=qc; i++)md(i);
for(register int i=1; i<=qc; i++)printf("%d\n",sum[i]);
return 0;
}