#include <cstdio>
#include <cstring>
using namespace std;
int v[262144];
int n,m,pozbuff,lungime=1;
char buff[1000001];
int read()
{int x=0;
while(buff[pozbuff]<'0'||buff[pozbuff]>'9')
{
if(++pozbuff==lungime){lungime=fread(buff,1,1000000,stdin);pozbuff=0;}
}
while(buff[pozbuff]>='0'&&buff[pozbuff]<='9')
{
x=x*10+buff[pozbuff]-'0';
if(++pozbuff==lungime){lungime=fread(buff,1,1000000,stdin);pozbuff=0;}
}
return x;
}
void update(int t,int st, int dr, int val, int poz )
{if(st==dr){v[t]=val;return;}
int m=(st+dr)>>1;
if(poz<=m){update(t<<1,st,m,val,poz); }
else update((t<<1)+1,m+1,dr,val,poz);
v[t]=v[2*t]<=v[2*t+1]?v[t*2+1]:v[2*t];
}
int query(int t, int st, int dr, int a, int b)
{
if(a<=st&&dr<=b)return v[t];
int m=(st+dr)/2,i=0,j=0;
if(a<=m){i=query(2*t,st,m,a,b); }
if(m+1<=b){j=query(2*t+1,m+1,dr,a,b); }
return i>j?i:j;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int i;
n=read();
m=read();
for(i=1;i<=n;i++)update(1,1,n,read(),i);
int a,b,c;
for(i=0;i<m;i++)
{
a=read();b=read();c=read();
if(a==0)printf("%d\n",query(1,1,n,b,c));
else update(1,1,n,c,b);
}
return 0;
}