#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int Nmax = 1e5+1;
int n,m;
vector<int> a, st;
void build(int nod, int l, int r){
if(l == r){
st[nod] = a[l];
return;
}
int m = (l+r)/2;
build(2*nod, l, m);
build(2*nod+1, m+1, r);
st[nod] = max(st[2*nod], st[2*nod+1]);
}
void update(int nod, int i, int v, int l, int r){
if(l == r){
st[nod] = v;
return;
}
int m = (l+r)/2;
if(i <= m) update(2*nod, i, v, l, m);
else update(2*nod+1, i, v, m+1, r);
st[nod] = max(st[2*nod], st[2*nod+1]);
}
int query(int nod, int l, int r, int lx, int rx){
if(r < lx || l > rx) return -1;
if(l <= lx && rx <= r) return st[nod];
int m = (lx+rx)/2;
int val1 = query(2*nod, l, r, lx, m);
int val2 = query(2*nod+1, l, r, m+1, rx);
return max(val1, val2);
}
int main(){
fin >> n >> m;
a.resize(n);
st.resize(4*n);
for(int i = 0; i<n; i++){
fin >> a[i];
}
build(1, 0, n-1);
while(m--){
int c, x, y;
fin >> c >> x >> y;
if(c == 0){
fout << query(1, x-1, y-1, 0, n-1) << '\n';
}
else{
update(1, x-1, y, 0, n-1);
}
}
return 0;
}