#include <bits/stdc++.h>
#define MAXN 100005
#define FILENAME std::string("arbint")
std::ifstream input (FILENAME+".in");
std::ofstream output(FILENAME+".out");
int N, M;
int V[MAXN];
int ST[4*MAXN];
#define LEFT 2*index
#define RIGHT 2*index+1
#define MIDDLE (left+right)/2
void build(int left = 1, int right = N, int index = 1) {
if (left == right) { ST[index] = V[left]; return; }
build(left, MIDDLE, LEFT);
build(MIDDLE+1, right, RIGHT);
ST[index] = std::max(ST[LEFT], ST[RIGHT]);
}
void update(int pos, int X, int left = 1, int right = N, int index = 1) {
if (left == right) { ST[index] = X; return;}
if (pos <= MIDDLE) update(pos, X, left, MIDDLE, LEFT);
else update(pos, X, MIDDLE+1, right, RIGHT);
ST[index] = std::max(ST[LEFT], ST[RIGHT]);
}
int query(int A, int B, int left = 1, int right = N, int index = 1) {
if (A <= left && right <= B) return ST[index];
int max = -2e9;
if (A <= MIDDLE) max = std::max(max, query(A, B, left, MIDDLE, LEFT));
if (MIDDLE < B) max = std::max(max, query(A, B, MIDDLE+1, right, RIGHT));
return max;
}
int main()
{
input >> N >> M;
for (int i=1; i<=N; ++i) input >> V[i];
build();
int t, a, b;
for (int i=1; i<=M; ++i) {
input >> t >> a >> b;
if (t == 0) output << query (a, b) << '\n';
else update(a, b);
}
return 0;
}