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