#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("arbint.in"); ofstream g("arbint.out");
int n,m,ans,x,y,c,arb[400003];
void update(int nod, int st, int dr, int poz, int val) {
int mij = (st + dr) / 2;
if(st == dr) {
arb[nod] = val;
return;
}
if(poz <= mij) {
update(2*nod, st, mij, poz, val);
}
else {
update(2*nod + 1, mij+1, dr, poz, val);
}
arb[nod] = max(arb[2*nod],arb[2*nod+1]);
}
void query(int nod, int st, int dr, int x, int y) {
int mij = (st + dr) / 2;
if(st >= x && dr <= y) {
ans = max(ans,arb[nod]);
return;
}
if(y > mij) {
query(nod*2+1,mij+1,dr,x,y);
}
if(x <= mij) {
query(nod*2,st,mij,x,y);
}
}
int main() {
int i,j;
f>>n>>m;
for(i = 1; i <= n; ++i) {
f>>x;
update(1,1,n,i,x);
}
for(i = 1; i <= m; ++i) {
f>>c>>x>>y;
if (c) {
update(1,1,n,x,y);
}
else {
ans = 0;
query(1,1,n,x,y);
g<<ans<<'\n';
}
}
return 0;
}