#include <cstdio>
#define max(a,b) (a > b ? a : b)
#define NMAX 100005
using namespace std;
int v[NMAX],A[NMAX*2];
int n,m,x,y,Max,t;
void update(int st, int dr, int poz, int niv)
{
if (st == dr)
{
A[niv] = v[poz];
return;
}
int mij = (st + dr) / 2;
if (poz <= mij) update(st,mij,poz,niv*2);
else update(mij+1,dr,poz,niv*2+1);
A[niv]=max(A[niv*2],A[niv*2+1]);
}
void query(int st, int dr, int x, int y, int niv)
{
if (x <= st && dr <= y)
{
if (Max < A[niv]) Max = A[niv];
return;
}
int mij = (st+dr)/2;
if (x <= mij) query(st,mij,x,y,niv*2);
if (mij < y) query(mij+1,dr,x,y,niv*2+1);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i)
{
scanf("%d",&v[i]);
update(1,n,i,1);
}
for(int i = 1; i <= m; ++i)
{
scanf("%d",&t);
if (t == 0)
{
scanf("%d%d",&x,&y);
Max = 0;
query(1,n,x,y,1);
printf("%d\n",Max);
}
else
{
scanf("%d%d",&x,&y);
v[x]=y;
update(1,n,x,1);
}
}
return 0;
}