#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[100001], n, q;
struct segmentTree{
int n, aint[400001], maxi;
void init(int n){
this->n = n;
for(int i = 0; i <= 4 * n; i++)
this->aint[i] = aint[i];
this->maxi = maxi;
}
void build(int nod, int l, int r){
if(l == r)
aint[nod] = v[l];
else{
int mid = (l + r) >> 1;
build(2 * nod, l, mid);
build(2 * nod + 1, mid + 1, r);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
void update(int nod, int l, int r, int i, int val){
if(l == r)
aint[nod] = val;
else{
int mid = (l + r) >> 1;
if(i >= l && i <= mid)
update(2 * nod, l, mid, i, val);
else
update(2 * nod + 1, mid + 1, r, i, val);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
void query(int nod, int l, int r, int a, int b){
if(a <= l && r <= b)
maxi = max(maxi, aint[nod]);
else{
int mid = (l + r) >> 1;
if(a <= mid)
query(2 * nod, l, mid, a, b);
else
query(2 * nod + 1, mid + 1, r, a, b);
}
}
};
segmentTree segTree;
void read(){
fin >> n >> q;
for(int i = 1; i <= n; i++)
fin >> v[i];
segTree.init(n);
segTree.build(1, 1, n);
}
void processQueries(){
for(int i = 1; i <= q; i++){
int t, a, b;
fin >> t >> a >> b;
if(t == 0){
segTree.maxi = -1e9;
segTree.query(1, 1, n, a, b);
fout << segTree.maxi << "\n";
}
else
segTree.update(1, 1, n, a, b);
}
}
int main()
{
read();
processQueries();
return 0;
}