#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int v[100050], n, m,poz, maxim;
void update(int l, int r, int nod,int poz, int val)
{
if(l==r)
{ v[nod]=val;
return;
}
int mid=(l+r)/2;
if(poz<=mid)
update(l, mid, 2*nod, poz, val);
else
update(mid+1,r, 2*nod+1, poz, val);
v[nod]=max(v[2*nod], v[2*nod+1]);
}
void query(int nod, int l, int r, int st, int dr)
{
if(st<=l && r<=dr)
{
if(maxim<v[nod]) maxim=v[nod];
return;
}
int mid=(l+r)/2;
if(st<=mid)
query(2*nod, l, mid, st, dr);
if(mid<dr)
query(2*nod+1, mid+1, r, st, dr);
}
void citire ()
{
f>>n>>m;
int i,x;
for(i=1;i<=n;++i)
{
f>>x;
update(1,n, 1,i,x);
}
}
int main()
{ citire();
int op,a, b;
while(m--)
{
f>>op>>a>>b;
if(op==0)
{
maxim=-1;
query(1,1,n,a,b);
g<<maxim<<'\n';
}
else
{
poz=a;
update(1, n, 1, a, b);
}
}
f.close();
g.close();
}