#include <bits/stdc++.h>
using namespace std;
#define NMAX 100000
int a[NMAX], aint[NMAX * 5];
void build(int nod,int st, int dr){
if(st == dr){
aint[nod] = a[st];
}else{
int mid = ( st + dr) >> 1;
build(nod * 2, st, mid);
build(nod * 2 + 1, mid + 1, dr);
aint[nod] = max(aint[nod * 2], aint[2 * nod +1]);
}
}
void update(int nod, int st, int dr, int poz, int x){
if( st == dr){
aint[nod] = x;
}else{
int mid = ( st + dr) >> 1;
if(poz <= mid){
update(nod * 2, st, mid, poz, x);
}
if(poz > mid){
update(nod * 2 + 1, mid + 1, dr, poz , x);
}
aint[nod] = max(aint[nod * 2], aint[2 * nod +1]);
}
}
int maxim = -1;
void query(int nod, int st, int dr, int l, int r){
if(l <= st && r >= dr){
maxim = max(maxim, aint[nod]);
}else{
int mid = (st + dr) >> 1;
if(l <= mid){
query(nod * 2, st, mid, l,r);
}
if(r > mid){
query(nod * 2 + 1, mid + 1, dr, l , r );
}
}
}
int main (void){
ofstream cout("arbint.out");
ifstream cin("arbint.in");
int n, Q;
cin >> n >> Q;
for(int i = 1;i <= n; i++){
cin >> a[i];
}
build(1,1,n);
while(Q--){
int q, x, y;
cin >> q >> x >> y;
if(q == 1){
update(1,1,n,x,y);
}else{
maxim = -1e9;
query(1,1,n,x,y);
cout << maxim << '\n';
}
}
}