#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, x[400004], a, B;
void update(int nod, int st, int dr, int a, int b) {
int max1=0, mij;
if (a <= st && dr <= b) {
x[nod] = B;
}
else {
mij = (st + dr) / 2;
if (a <= mij)
update (2*nod, st, mij, a, b);
if (b > mij)
update (2*nod+1, mij+1, dr, a, b);
if (x[2*nod] > x[2*nod+1])
max1 = x[2*nod];
else
max1 = x[2*nod + 1];
x[nod] = max1;
}
//x[nod]= (x[2*nod] > x[2*nod+1] ? x[2*nod]:x[2*nod+1])
}
int query (int nod, int st, int dr, int a, int b) {
int max1=0, max2=0, mij;
if (a <= st && dr <= b)
return x[nod];
else {
mij = (st+dr)/2;
if (a<=mij)
max1=query (2*nod, st, mij, a, b);
if (b>mij)
max2=query (2*nod+1, mij+1, dr, a, b);
if (max1 > max2)
return max1;
else
return max2;
}
}
int main()
{
int i, j, a, b;
int t;
f>>n>>m;
for (i=1;i<=n;i++) {
f>>B;
update(1,1,n,i,i);}
for (i=1;i<=m;i++) {
f>>t>>a>>b;
if (t==0)
g<<query(1, 1, n, a, b)<<"\n";
else
{ B=b;
update(1, 1, n, a, a);}
}
return 0;
}