#include <fstream>
#define NMAX 300005
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int arb[NMAX];
void update (int nod, int poz, int val, int st, int dr) {
int m;
if (st==dr) arb[nod]=val;
else {
m=(st+dr)/2;
if (poz<=m) update(2*nod, poz, val, st, m);
else update (2*nod+1, poz, val, m+1, dr);
arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}
}
int query (int nod, int st, int dr, int a, int b) {
int x=-1, y=-1, mij;
if (st>=a && dr<=b) return arb[nod];
else {
mij=(st+dr)/2;
if (mij>=a) x=query(2*nod, st, mij, a, b);
if (mij+1<=b) y=query(2*nod+1, mij+1, dr, a, b);
return max(x, y);
}
}
int main()
{
int n, m, i, val, tip, poz, st, dr;
fin>>n>>m;
/*for (i=1; i<=n; ++i) {
arb[i]=-1;
}*/
for (i=1; i<=n; ++i) {
fin>>val;
update (1, i, val, 1, n);
}
for (i=1; i<=m; ++i) {
fin>>tip;
if (tip==1) { //update
fin>>poz>>val;
update (1, poz, val, 1, n);
}
else { //query
fin>>st>>dr;
fout<<query (1, 1, n, st, dr)<<'\n';
}
}
fout.close();
return 0;
}