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