#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, t[400001], v[400001], q, c;
void build(int a[], int v, int tl, int tr){
if(tl == tr)
t[v] = a[tl];
else{
int tm = (tl + tr) / 2;
build(a, 2 * v, tl, tm);
build(a, 2 * v + 1, tm + 1, tr);
t[v] = max(t[v * 2], t[v * 2 + 1]);
}
}
int maxim(int v, int tl, int tr, int l, int r){
if(l > r) return 0;
if(l == tl && r == tr) return t[v];
int tm = (tl + tr) / 2;
int max1 = maxim(v * 2, tl, tm, l, min(r, tm));
int max2 = maxim(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);
return max(max1, max2);
}
void update(int v, int tl, int tr, int pos, int nevl){
if(tl == tr) t[v] = nevl;
else{
int tm = (tl + tr) / 2;
if(pos <= tm)
update(v * 2, tl, tm, pos, nevl);
else update(v * 2 + 1, tm + 1, tr, pos, nevl);
t[v] = max(t[v * 2], t[v * 2 + 1]);
}
}
int main(){
ios_base::sync_with_stdio(false);
fin.tie(NULL);
fin >> n >> q;
for(int i = 1; i <= n; i++)
fin >> v[i];
build(v, 1, 1, n);
while(q){
q--;
fin >> c;
if(c){
int a, b;
fin >> a >> b;
update(1, 1, n, a, b);
}
else{
int l ,r;
fin >> l >> r;
fout << maxim(1, 1, n, l, r) << '\n';
}
}
}