#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e4+10;
const int inf=0x3f3f3f3f;
struct node{
int lc,rc;
int rank,val;
int cnt,size;
int val2;
#define lc(x) a[x].lc
#define rc(x) a[x].rc
#define rank(x) a[x].rank
#define val(x) a[x].val
#define cnt(x) a[x].cnt
#define size(x) a[x].size
#define val2(x) a[x].val2
}a[maxn];
int b[maxn];
int root;
struct Treap{
int tot;
int newnode(int v,int v2){
val(++tot)=v;
val2(tot)=v2;
rank(tot)=rand();
cnt(tot)=size(tot)=1;
return tot;
}
void update(int p){
size(p)=size(lc(p))+size(rc(p))+cnt(p);
}
void build_tree(){
tot=0; root=1;
newnode(-inf,-inf);
newnode(inf,inf);
a[1].rc=2;
update(1);
}
void rotate_left(int &p){
int q=rc(p);
rc(p)=lc(q);
lc(q)=p;
p=q;
update(lc(p));
update(p);
}
void rotate_right(int &p){
int q=lc(p);
lc(p)=rc(q);
rc(q)=p;
p=q;
update(rc(p));
update(p);
}
void insert(int &p,int v,int v2){
if(p==0){
p=newnode(v,v2);
return ;
}
if(v<val(p)){
insert(lc(p),v,v2);
if(rank(lc(p))>rank(p)) rotate_right(p);
}else if(v==val(p)){
if(v2<val2(p)){
insert(lc(p),v,v2);
if(rank(lc(p))>rank(p)) rotate_right(p);
}else{
insert(rc(p),v,v2);
if(rank(rc(p))>rank(p)) rotate_left(p);
}
}else{
insert(rc(p),v,v2);
if(rank(rc(p))>rank(p)) rotate_left(p);
}
update(p);
return ;
}
void remove(int &p,int v,int v2){
if(p==0) return ;
if(v<val(p)){
remove(lc(p),v,v2);
}else if(v>val(p)){
remove(rc(p),v,v2);
}else{
if(v2<val2(p)){
remove(lc(p),v,v2);
}else if(v2>val2(p)){
remove(rc(p),v,v2);
}else if(rc(p)||lc(p)){
if(rc(p)==0||rank(rc(p))<rank(lc(p))){
rotate_right(p);
remove(rc(p),v,v2);
}else{
rotate_left(p);
remove(lc(p),v,v2);
}
}else{
p=0;
}
}
update(p);
return ;
}
int getrank(int p,int v,int v2){
if(p==0) return 0;
if(v==val(p)){
if(v2==val2(p)) return size(lc(p))+1;
else if(v2<val2(p)) return getrank(lc(p),v,v2);
else return getrank(rc(p),v,v2)+size(lc(p))+cnt(p);
}
if(v<val(p)) return getrank(lc(p),v,v2);
return getrank(rc(p),v,v2)+size(lc(p))+cnt(p);
}
}tree;
int main(){
int n,q;
cin>>n>>q;
tree.build_tree();
for(int i=1;i<=n;i++){
cin>>b[i];
tree.insert(root,b[i],i);
}
for(int i=1;i<=q;i++){
int type;
cin>>type;
if(type==1){
int x,v;
cin>>x>>v;
tree.remove(root,b[x],x);
b[x]=v;
tree.insert(root,b[x],x);
}else{
int x;
cin>>x;
int ra=tree.getrank(root,b[x],x)-1;
cout<<ra<<endl;
}
}
return 0;
}