#include <fstream>
using namespace std;
const int MAX_N = 100002;
int N, M;
int v[MAX_N], A[MAX_N];
void update(int node, int left, int right, int x, int val) {
if(left == x && x == right)
A[node] = val;
else {
int m = (left+right)/2;
if(x <= m)
update(2*node, left, m, x, val);
else update(2*node + 1, m+1, right, x, val);
A[node] = max(A[2*node], A[2*node + 1]);
}
}
int query(int node, int left, int right, int x, int y) {
if(x <= left && right <= y)
return A[node];
else {
int m = (left+right)/2;
if(x <= left)
return query(2*node, left, m, x, y);
else if(m < y)
return query(2*node + 1, m+1, right, x, y);
}
}
int main() {
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> N >> M;
for(int i = 1; i <= N; ++i) {
f >> v[i];
update(1, 1, N, i, v[i]);
}
for(int i = 1; i <= M; ++i) {
int t, x, y;
f >> t >> x >> y;
if(t == 0)
g << query(1, 1, N, x, y) << "\n";
else update(1, 1, N, x, y);
}
f.close();
g.close();
return 0;
}