#include <stdio.h>
#define NMAX 100005
#define LMAX (1<<18)
int n,m,A[NMAX],arb[LMAX],ap[NMAX],a,b;
void read()
{
scanf("%d%d",&n,&m);
int i;
for (i=1; i<=n; i++)
scanf("%d",&A[i]);
}
inline int max(int x,int y)
{
return x>y ? x : y;
}
void cstr(int st,int dr,int nod)
{
if (st==dr)
{
arb[nod]=A[st];
ap[st]=nod;
return ;
}
int mij=(st+dr)/2;
cstr(st,mij,nod*2);
cstr(mij+1,dr,nod*2+1);
arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
inline int find(int st,int dr,int nod)
{
if (b<st || dr<a)
return 0;
if (a<=st && dr<=b)
return arb[nod];
int mij=(st+dr)/2;
return max(find(st,mij,nod*2),find(mij+1,dr,nod*2+1));
}
void change(int poz,int val)
{
int nod=ap[poz];
arb[nod]=val;
for ( nod/=2 ; nod ; nod/=2)
arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
void solve()
{
int i,tip;
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&tip,&a,&b);
if (tip==0)
printf("%d\n",find(1,n,1));
else
change(a,b);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
read();
cstr(1,n,1);
solve();
return 0;
}