#include <fstream>
using namespace std;
#define NMAX 100001
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, m;
int tree[4 * NMAX + 66];
void update(int node, int left, int right, int pos, int val) {
if (left == right) {
tree[node] = val;
return;
}
int mid = (left + right) / 2;
if (pos <= mid)
update(2 * node, left, mid , pos, val);
else update(2 * node + 1, mid + 1, right, pos, val);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void query(int node, int left, int right, int start, int finish, int& maxim) {
if (start <= left && right <= finish) {
if (tree[node] > maxim)
maxim = tree[node];
return;
}
int mid = (left + right) / 2;
if (start <= mid)
query(2 * node, left, mid, start, finish, maxim);
if (mid < finish)
query(2 * node + 1, mid + 1, right, start, finish, maxim);
}
int main() {
cin >> n >> m;
for (int i = 1, x; i <= n; ++i) {
cin >> x;
update(1, 1, n, i, x);
}
for (int i = 1, x, a, b; i <= m; ++i) {
cin >> x >> a >> b;
if (x == 0) {
int maxim = -1;
query(1, 1, n, a, b, maxim);
cout << maxim << "\n";
} else update(1, 1, n, a, b);
}
cin.close();
cout.close();
return 0;
}