#include <fstream>
using namespace std;
const int MAX_N = 100002;
int N, M;
int A[7*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) {
int ans = 0;
if(x <= left && right <= y)
ans = A[node];
else {
int m = (left+right)/2;
if(x <= m)
ans = query(2*node, left, m, x, y);
if(y > m)
ans = max(ans, query(2*node + 1, m+1, right, x, y));
}
return ans;
}
int main() {
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> N >> M;
for(int i = 1, value; i <= N; ++i) {
f >> value;
update(1, 1, N, i, value);
}
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;
}