#include <bits/stdc++.h>
using namespace std;
#define NMAX 100001
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int Arbint[4 * NMAX], v[NMAX];
inline int L(const int node) {
return (node << 1);
}
inline int R(const int node) {
return (node << 1) + 1;
}
void buildArb(int node, int st, int dr) {
if (st == dr) {
Arbint[node] = v[st];
return;
}
int mid = (st + dr) >> 1;
buildArb(L(node), st, mid);
buildArb(R(node), mid + 1, dr);
Arbint[node] = max(Arbint[L(node)], Arbint[R(node)]);
}
void update(int node, int st, int dr, int poz, int val) {
if (st == dr) {
Arbint[node] = val;
return;
}
int mid = (st + dr) >> 1;
if (poz <= mid)
update(L(node), st, mid, poz, val);
else
update(R(node), mid + 1, dr, poz, val);
Arbint[node] = max(Arbint[L(node)], Arbint[R(node)]);
}
int query(int node, int st, int dr, int a, int b) {
if (a <= st && dr <= b) {
return Arbint[node];
}
int mid = (st + dr) >> 1;
int t1 = 0, t2 = 0;
if (a <= mid)
t1 = query(L(node), st, mid, a, b);
if (b > mid)
t2 = query(R(node), mid + 1, dr, a, b);
return max(t1, t2);
}
int main() {
int N, Q;
fin >> N >> Q;
for (int i = 1; i <= N; ++i)
fin >> v[i];
buildArb(1, 1, N);
int t, x, y;
while (Q--) {
fin >> t >> x >> y;
if (t == 0) {
fout << query(1, 1, N, x, y) << "\n";
}
else {
update(1, 1, N, x, y);
}
}
return 0;
}