#include <bits/stdc++.h>
#define mij(st,fn) ((st+fn)/2)
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int LeftSon(int x)
{
return x*2;
}
int RightSon(int x)
{
return x*2+1;
}
int v[100005],arb[400005],k,poz,val,n,m,RQuery,LQuery,ans;
void Formare(int nod,int st,int fn)
{
if(st==fn) {arb[nod]=v[st];return;}
Formare(LeftSon(nod),st,mij(st,fn));
Formare(RightSon(nod),mij(st,fn)+1,fn);
arb[nod]=max(arb[LeftSon(nod)],arb[RightSon(nod)]);
}
void Update(int nod,int st,int fn)
{
if(st==fn)
{
arb[st]=val;
return;
}
if(poz<=mij(st,fn))
Update(arb[LeftSon(nod)],st,mij(st,fn));
else
Update(arb[RightSon(nod)],mij(st,fn)+1,fn);
arb[nod]=max(arb[LeftSon(nod)],arb[RightSon(nod)]);
}
void Query(int nod, int left, int right)
{
if(LQuery<=left&&right<=RQuery)
{
ans = max(ans,arb[nod]);
return;
}
if(LQuery<=mij(left,right))
Query(LeftSon(nod),left,mij(left,right));
if(RQuery>=mij(left,right)+1)
Query(RightSon(nod),mij(left,right)+1,right);
}
int main()
{
int op, x, y;
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>v[i];
Formare(1,1,n);
for (int i=1;i<=m;i++)
{
fin>>op>>x>>y;
if(op==0)
{
ans = -2000000000;
LQuery=x;
RQuery=y;
Query(1, 1, n);
fout<<ans<<"\n";
}
else
{
poz=x;
val=y;
Update(1, 1, n);
}
}
return 0;
}