#include <bits/stdc++.h>
using namespace std;
struct SegTree {
int n;
int* a;
SegTree(int x) {
n = x;
a = new int [4 * n + 5];
memset(a, 0, sizeof(a));
}
void build(vector<int>v) {
for (int i = 1; i <= n; ++i)
u(1, 1, n, i, v[i - 1]);
}
void update(int poz, int val) {
u(1, 1, n, poz, val);
}
int query(int st, int dr) {
return q(1, 1, n, st, dr);
}
void u(int node, int st, int dr, int poz, int val) {
if (st == dr) {
a[node] = val;
return ;
}
int med = (st + dr) >> 1;
if (med >= poz)
u(2 * node, st, med, poz, val);
else
u(2 * node + 1, med + 1, dr, poz, val);
a[node] = max(a[2 * node], a[2 * node + 1]);
}
int q(int node, int st, int dr, int l, int r) {
if (l <= st && dr <= r)
return a[node];
int ans = 0;
int med = (st + dr >> 1);
if (l <= med)
ans = q(2 * node, st, med, l, r);
if (r > med)
ans = max(ans, q(2 * node + 1, med + 1, dr, l, r));
return ans;
}
};
int main(){
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
vector<int>v;
for (int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
v.push_back(x);
}
SegTree a(n);
a.build(v);
for (int i = 1; i <= m; ++i) {
int t, x, y;
scanf("%d%d%d", &t, &x, &y);
if (t == 0)
printf("%d\n", a.query(x, y));
else
a.update(x, y);
}
return 0;
}