#include<fstream>
#include<iostream>
using namespace std;
int v[100005],a[400100],n,m;
void init (int k, int st , int dr )
{
if (st==dr){
a[k]=v[st];return ;}
int mij=(st+dr)/2;
init(k*2,st,mij);
init(k*2+1,mij+1,dr);
a[k]=max(a[k*2],a[k*2+1]);
}
int query (int k, int st, int dr, int l, int d )
{
if (st>d) return 0;
if (dr<l) return 0;
if (l<=st && dr<=d) return a[k];
int mij=(st+dr)/2;
return max (query(k*2,st,mij,l,d),query(k*2+1,mij+1,dr,l,d));
}
void update (int k, int st, int dr, int poz )
{
if (st==dr) {a[k]=v[st] ; return;}
int mij=(st+dr)/2;
if (mij>=poz)
update(k*2,st,mij,poz);
else
update (k*2+1,mij+1,dr, poz);
a[k]=max (a[k*2],a[k*2+1]);
}
void citire (FILE *f)
{
int i;
fscanf (f,"%d%d",&n,&m);
for (i=1;i<=n;i++)
fscanf (f,"%d",&v[i]);
}
void solve (FILE *f)
{
int i,tip,x,y,j;
FILE *g=fopen("arbint.out","w");
for (i=1;i<=m;i++)
{
fscanf (f,"%d%d%d",&tip,&x,&y);
switch (tip)
{
case 0 : { fprintf( g,"%d\n",query(1,1,n,x,y)); break; }
case 1 : { v[x]=y; update (1,1,n,x); }
}
}
fclose(g);
}
int main()
{
FILE *f=fopen ("arbint.in","r");
citire(f);
init(1,1,n);
solve(f);
fclose(f);
return 0;
}