#include <cstdio>
#include <iostream>
#define nmax 100005
using namespace std;
FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");
int n,m,v[nmax],arbore[nmax<<2],maxim;
void build(int nod,int poz,int val,int st,int dr)
{
int mid=(st+dr)/2;
if (st==poz&&st==dr)
{
arbore[nod]=val;
return;
}
if (poz<=mid)
build(nod*2,poz,val,st,mid);
else
build(nod*2+1,poz,val,mid+1,dr);
arbore[nod]=max(arbore[nod*2],arbore[nod*2+1]);
}
void query(int nod,int left,int right,int st,int dr)
{
int mid=(st+dr)/2;
if (st>=left&&dr<=right)
{
maxim=max(maxim,arbore[nod]);
return;
}
if (left>dr||right<st)
return;
query(nod*2,left,right,st,mid);
query(nod*2+1,left,right,mid+1,dr);
}
void read()
{
fscanf(f,"%d %d",&n,&m);
for (int i=1;i<=n;++i)
{
fscanf(f,"%d",&v[i]);
build(1,i,v[i],1,n);
}
for (int i=1;i<=m;++i)
{
int a,b,c;
fscanf(f,"%d %d %d",&a,&b,&c);
if (a==1)
build(1,b,c,1,n);
else
{
maxim=-1;
query(1,b,c,1,n);
fprintf(g,"%d\n",maxim);
}
}
}
int main()
{
read();
return 0;
}