#include <bits/stdc++.h>
using namespace std;
int n, m, maxx;
int tree[ 200010 ];
void update(int nod, int left, int right, int pos, int val){
if (left == right){
tree[ nod ] = val;
return ;
}
int mid = (left + right) / 2;
if (pos <= mid)
update(nod << 1, left, mid, pos, val);
else
update(nod << 1 | 1, mid + 1, right, pos, val);
tree[ nod ] = max(tree[ nod << 1], tree[ nod << 1 | 1 ]);
}
void query(int nod, int left, int right, int l, int r){
if (l <= left && right <= r){
if (maxx < tree[ nod ]) maxx = tree[ nod ];
return ;
}
int mid = (right + left) / 2;
if (l <= mid)
query(nod << 1, left, mid, l, r);
if (mid < r)
query(nod << 1 | 1, mid + 1, right, l, r);
}
int main(){
ios_base::sync_with_stdio(false);
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin >> n >> m;
for (int i = 1, x; i <= n; ++i){
cin >> x;
update(1, 1, n, i, x);
}
for (int i = 1, q, a, b; i <= m; ++i){
cin >> q >> a >> b;
if (q == 0){
maxx = -1;
query(1, 1, n, a, b);
cout << maxx << '\n';
}
else
update(1, 1, n, a, b);
}
}