#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int tree[4 * NMAX + 1], v[NMAX + 1], ans;
void query(int node, int st, int dr, int a, int b) {
if (a <= st && dr <= b) {
ans = max(ans, tree[node]);
return;
}
int mid = (st + dr)/2;
if (a <= mid) {
query(node*2, st, mid, a, b);
}
if (b > mid) {
query(node*2+1, mid+1, dr, a, b);
}
}
void update(int node, int st, int dr, int val, int pos) {
if (st == dr) {
tree[node] = val;
return;
}
int mid = (st + dr)/2;
if (pos <= mid)
update(node*2, st, mid, val, pos);
else
update(node*2+1, mid+1, dr, val, pos);
tree[node] = max(tree[node*2], tree[node*2+1]);
}
void dfs(int node, int st, int dr) {
if (st == dr) {
tree[node] = v[st];
return;
}
int mid = (st + dr)/2;
dfs(node*2, st, mid);
dfs(node*2 + 1, mid+1, dr);
tree[node] = max(tree[node*2], tree[node*2+1]);
}
int main() {
int n, m;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> v[ i ];
}
dfs(1, 1, n);
while (m--) {
int q, a, b;
cin >> q >> a >> b;
if (q == 0) {
ans = -1;
query(1, 1, n, a, b);
cout << ans << '\n';
}
else {
update(1, 1, n, b, a);
}
}
}