#include <iostream>
#include <fstream>
#define nmax (1<<16)
using namespace std;
int H[nmax], v[nmax], n, m, sol, type, a, b, val, pos;
void update(int node, int left, int right) {
if(left == right) {
H[node] = val;
return;
}
int mid = (left+right)>>1;
if(pos <= mid) update(2*node, left, mid);
else update(2*node+1, mid+1, right);
H[node] = max(H[2*node], H[2*node+1]);
}
void query(int node, int left, int right, int a, int b) { //interoghez intervalul [a,b]
if(a <= left && right <= b) {
sol = max(sol, H[node]);
return;
}
int mid = (left+right)>>1;
if(a <= mid) query(2*node, left, mid, a, b);
if(mid < b) query(2*node+1, mid+1, right, a, b);
}
int main() {
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
for(int i=1; i<=n; i++) {
f>>a;
val = a;
pos = i;
update(1, 1, n);
}
for(int i=1; i<=m; i++) {
f>>type>>a>>b;
if(type==0) {
sol = 0;
query(1, 1, n, a, b);
g<<sol<<"\n";
}
else {
val = b;
pos = a;
update(1, 1, n);
}
}
return 0;
}