#include<stdio.h>
int n,m,poz,val,s,f,a[100],maxim;
int max(int x,int y)
{ return x>y ? x:y;
}
void update(int nod, int st,int dr)
{ if(st==dr) { a[nod]=val;
return;
}
int mij=(st+dr)/2;
if(poz<=mij) update(2*nod,st,mij);
else update(2*nod+1,mij+1,dr);
a[nod]=max(a[2*nod],a[2*nod+1]);
}
void query(int nod,int st,int dr)
{ if(s<=st && dr<=f)
{ if(maxim<a[nod]) maxim=a[nod];
return;
}
int mij=(st+dr)/2;
if(s<=mij) query(2*nod,st,mij);
if(mij<f) query(2*nod+1,mij+1,dr);
}
int main()
{ freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
int i,op,y,z;
for(i=1;i<=n;i++)
{ scanf("%d",&y);
poz=i;
val=y;
update(1,1,n);
}
for(i=1;i<=m;i++)
{ scanf("%d%d%d",&op,&y,&z);
if(op)
{ poz=y;
val=z;
update(1,1,n);
}
else { maxim=-1;
s=y;
f=z;
query(1,1,n);
printf("%d\n",maxim);
}
}
return 0;
}