#include <stdio.h>
#include <algorithm>
using namespace std;
#define Nmax 100005
int n, m;
int pos, val;
int a, b, maxx;
int tree[3 * Nmax];
void update(int node, int l, int r){
if (l == r)
tree[node] = val;
else{
int m = (l + r) / 2;
if (pos <= m)
update(node * 2, l, m);
else
update(node * 2 + 1, m + 1, r);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
}
void query(int node, int l, int r){
if (a <= l && r <= b)
maxx = max(maxx, tree[node]);
else{
int m = (l + r) / 2;
if (a <= m)
query(node * 2, l, m);
if (m < b)
query(node * 2 + 1, m + 1, r);
}
}
void read(){
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i){
scanf("%d", &val);
pos = i;
update(1, 1, n);
}
}
void solve(){
int op;
for (int i = 1; i <= m; ++i){
scanf("%d", &op);
if (op == 1){
scanf("%d %d", &pos, &val);
update(1, 1, n);
}
else{
scanf("%d %d", &a, &b);
maxx = -1;
query(1, 1, n);
printf("%d\n", maxx);
}
}
}
int main(){
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
read();
solve();
return 0;
}