#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int v[100002],n,aint[400002];
void init(int nod, int st, int dr) {
if (st == dr) {
aint[nod] = v[st];
} else {
int mij = (st + dr) / 2;
init(2 * nod, st, mij) ;
init(2 * nod + 1, mij + 1, dr);
aint[nod] = max(aint[2 * nod] , aint[2 * nod + 1]);
}
}
void init() {
init(1, 1, n);
}
int query(int nod, int st, int dr, int left, int right) {
if (st == left && dr == right) {
return aint[nod];
} else {
int mij = (st + dr) / 2;
if (right <= mij)
return query(2 * nod, st, mij, left, right);
else if (mij < left)
return query(2 * nod + 1, mij + 1, dr, left, right);
else
return max(query(2 * nod, st, mij, left, mij), query(2 * nod + 1, mij + 1, dr, mij + 1, right));
}
}
int query(int left, int right) {
return query(1, 1, n, left, right);
}
void update(int nod, int st, int dr, int index, int newValue) {
if (st == dr) {
aint[nod] = newValue;
} else {
int mij = (st + dr) / 2;
if (index <= mij)
update(2 * nod, st, mij, index, newValue);
else
update(2 * nod + 1, mij + 1, dr, index, newValue);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
void update(int index, int newValue) {
update(1, 1, n, index, newValue);
}
int main()
{
int m,i,p,a,b;
f>>n>>m;
for(i=1;i<=n;i++)
f>>v[i];
init();
for(i=1;i<=m;i++)
{
f>>p>>a>>b;
if(p==0)
g<<query(a,b)<<'\n';
else
update(a,b);
}
return 0;
}