#include <bits/stdc++.h>
using namespace std;
#define endline '\n'
const int NMAX = 100001;
int aint[NMAX], maxim = -1;
void update(int node, int left, int right, int position, int val) {
if (left == right) {
aint[node] = val;
}else {
int mid = (left + right) / 2;
if (position <= mid) {
update(node * 2, left, mid , position, val);
}
if(position > mid) {
update(node * 2 + 1, mid + 1, right , position, val);
}
aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}
}
void query(int node, int l, int r, int left, int right) {
if(l >= left && r <= right) {
maxim = max(maxim, aint[node]);
}else {
int mid = (l + r) / 2;
if (left <= mid ) {
query(node * 2, l, mid, left, right);
}
if(right > mid) {
query(node * 2 + 1, mid + 1 , r, left, right);
}
}
}
int32_t main(void) {
ofstream cout("arbint.out");
ifstream cin("arbint.in");
int n, Q;
cin >> n >> Q;
for(int i = 1;i <= n;i++) {
int x;
cin >>x ;
update(1,1,n,i,x);
}
while(Q--) {
int q, x, y;
cin >> q >> x >> y;
if(q == 1) {
/// update this
update(1,1,n,x,y);
}else {
maxim = -1e9; /// initializing with a minus infinite
query(1,1,n,x,y);
cout << maxim << endline;
}
}
}