#include <cstdio>
#define dim 1<<18
using namespace std;
int A[dim],ARB[4*dim],N,M,i,j,x,y,max1,tip;
int max(int x,int y)
{
if (x>=y) return x;
else return y;
}
void Update(int nod, int st, int dr,int poz,int val)
{
if (st==dr)
{
ARB[nod]=val;
}
else
{
int m=(st+dr)/2;
if (poz<=m) Update(nod*2,st,m,poz,val);
else Update(nod*2+1,m+1,dr,poz,val);
ARB[nod]=max(ARB[nod*2],ARB[nod*2+1]);
}
}
void query(int nod, int st, int dr, int a, int b)
{
if (a<=st&&dr<=b)
{
if (ARB[nod]>max1) max1=ARB[nod];
}
else
{
int m=(st+dr)/2;
if (a<=m) query(nod*2,st,m,a,b);
if (m+1<=b) query (nod*2+1,m+1,dr,a,b);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d\n",&N,&M);
for (i=1;i<=N;i++)
{
scanf("%d",&x);
Update(1,1,N,i,x);
}
while (M>0)
{
M--;
scanf("%d%d%d",&tip,&x,&y);
if (tip==1)
{
Update(1,1,N,x,y);
}
else
{
max1=0;
query(1,1,N,x,y);
printf("%d\n",max1);
}
}
return 0;
}