#include <iostream>
#include <fstream>
#define MAX 100000
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arb[4*MAX+1];
void update(int nod, int left, int right, int pos, int val) {
if(left == right) {
arb[nod] = val;
return;
}
int div = (left+right)/2;
if(pos <= div)
update(2*nod, left, div, pos, val);
else
update(2*nod+1, div+1, right, pos, val);
arb[nod] = max(arb[2*nod], arb[2*nod+1]);
}
void query(int nod, int left, int right, int start, int finish, int &mx) {
if(start <= left && right <= finish) {
if(mx < arb[nod])
mx = arb[nod];
return;
}
int div = (left+right)/2;
if(start <= div)
query(2*nod, left, div, start, finish, mx);
if(div < finish)
query(2*nod+1, div+1, right, start, finish, mx);
}
int main() {
int n,m,a,b,t;
in >> n >> m;
for(int i = 1; i <= n; i++) {
in >> a;
update(1, 1, n, i, a);
}
for(int i = 1; i <= m; i++) {
in >> t >> a >> b;
if(t == 0) {
int mx = -1;
query(1, 1, n, a, b, mx);
out << mx << '\n';
} else
update(1, 1, n, a, b);
}
return 0;
}