#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define NMax 100100
#define Max(a,b) (a<b) ? b : a
using namespace std;
int N, M, ARB[4*NMax], i, Maxim, poz, val, start, sfarsit, tip, a, b, x;
void Update (int nod, int st, int dr)
{
if(st==dr)
{
ARB[nod]=val;
return;
}
int m=(st+dr)/2;
if(poz<=m) Update(2*nod,st,m);
else Update(2*nod+1,m+1,dr);
ARB[nod]=Max(ARB[2*nod],ARB[2*nod+1]);
}
void Interog (int nod, int st, int dr)
{
if(start<=st && dr<=sfarsit)
{
if(Maxim<ARB[nod]) Maxim=ARB[nod];
return;
}
int m=(st+dr)/2;
if(start<=m) Interog(2*nod,st,m);
if(m<sfarsit) Interog(2*nod+1,m+1,dr);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++)
{
scanf("%d",&x);
poz=i; val=x;
Update(1,1,N);
}
for(i=1;i<=M;i++)
{
scanf("%d %d %d",&tip,&a,&b);
if(tip==0)
{
Maxim=0; start=a; sfarsit=b;
Interog(1,1,N);
printf("%d\n",Maxim);
}
else
{
poz=a; val=b;
Update(1,1,N);
}
}
return 0;
}