#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[200002];
void update(int nod, int poz, int x, int st, int dr)
{
if(st==dr) v[nod]=x;
else
{int m=(st+dr)/2;
if(poz<=m) update(2*nod, poz, x, st, m);
else update(2*nod+1, poz, x, m+1, dr);
v[nod]=max(v[2*nod],v[2*nod+1]);
}
}
int query(int nod, int st, int dr, int a, int b)
{int m1=0, m2=0;
if(st>=a && dr<=b) return v[nod];
else {int m=(st+dr)/2;
if(m>=a) { m1=query(2*nod, st, m, a, b);}
if(m<b) { m2=query(2*nod+1, m+1, dr, a, b);}
return max(m1, m2);
}
}
int main()
{int k, a, b, n, m;
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>k;
update(1,i,k,1,n);
}
for(int i=1;i<=m;i++)
{
fin>>k>>a>>b;
if(k==0)
fout<<query(1,1,n,a,b)<<'\n';
else
update(1,a,b,1,n);
}
return 0;
}