#include<iostream>
#include<fstream>
using namespace std;
long arb[400501],a,b,maxim,val,v[100001],n,maxpoz=0;
long max(long a, long b)
{
if (a<b) return b;
else return a;
}
void update(int poz,int st,int dr, int a, int val)
{
if (st==dr) {arb[poz]=val; return; }
{
int mij=(st+dr)/2;
if (a<=mij) update(poz*2,st,mij,a,val);
else update(poz*2+1,mij+1,dr,a,val);
arb[poz]=max(arb[2*poz],arb[2*poz+1]);
}
}
void verif(int poz,int st, int dr)
{
if (a<=st && dr<=b) {if (arb[poz]>maxim) maxim=arb[poz]; return;}
{
int mij=(st+dr)/2;
if (a<=mij) verif(2*poz,st,mij);
if (b>mij) verif(2*poz+1,mij+1,dr);
}
}
int main()
{
int i,o,x,m;
FILE *f,*g;
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
fscanf(f,"%d",&n);
fscanf(f,"%d",&m);
for (i=1; i<=n; i++)
{
fscanf(f,"%d",&v[i]);
update(1,1,n,i,v[i]);
}
for (i=1; i<=m; i++)
{
fscanf(f,"%d",&o);
fscanf(f,"%d",&a);
fscanf(f,"%d",&b);
if (o==0)
{
maxim=0;
verif(1,1,n);
fprintf(g,"%d\n",maxim);
}
else update(1,1,n,a,b);
}
return 0;
}