#include <stdio.h>
#include<fstream>
using namespace std;
#define NMAX 100000
int v[NMAX],x[3*NMAX],n,m,max;
void init(int r,int st,int dr)
{
int m;
if(st==dr)
x[r]=v[st];
else
{ m=(st+dr)/2;
init(r*2,st,m);
init(r*2+1,m+1,dr);
if(x[2*r]>x[2*r+1])
x[r]=x[2*r];
else
x[r]=x[2*r+1];
}
}
int query(int r,int st,int dr,int a,int b)
{
int m,val;
if(a<=st&&dr<=b)
return x[r];
else
{ m=(st+dr)/2;
if(a<=m)
{
val=query(2*r,st,m,a,b);
if(val>max)
max=val;
}
if(b>=m+1)
{
val=query(2*r+1,m+1,dr,a,b);
if(val>max)
max=val;
}
return max;
}
}
void update(int r,int st,int dr,int a,int b)
{ int m;
if(st==dr)
x[r]=b;
else
{ m=(st+dr)/2;
if(a<=m)
{
update(2*r,st,m,a,b);
}
else
{
update(2*r+1,m+1,dr,a,b);
}
if(x[2*r]<x[2*r+1])
x[r]=x[2*r+1];
else
x[r]=x[2*r];
}
}
int main()
{ int t,a,b;
freopen("arbint.in","r",stdin);
ofstream fout("arbint.out");
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
init(1,1,n);
for(int i=1;i<=m;i++)
{ scanf("%d%d%d",&t,&a,&b);
if(t==0)
{
max=0;
fout<<query(1,1,n,a,b);
}
else
{
update(1,1,n,a,b);
}
}
fclose(stdin);
fout.close();
return 0;
}