#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, q, v[100001], ai[400001], t;
void build(int x, int st, int dr){
if(st == dr)
ai[x] = v[st];
else{
int mid = (st + dr) / 2;
build(x * 2, st, mid);
build(x * 2 + 1, mid + 1, dr);
ai[x] = max(ai[x * 2], ai[x * 2 + 1]);
}
}
void update(int x, int st, int dr, int pos, int val){
if(st == dr)
ai[x] = val;
else{
int mid = (st + dr) / 2;
if(pos <= mid)
update(x * 2, st, mid, pos, val);
else
update(x * 2 + 1, mid + 1, dr, pos, val);
ai[x] = max(ai[x * 2], ai[x * 2 + 1]);
}
}
int query(int x, int st, int dr, int qst, int qdr){
if(qst <= st && dr <= qdr)
return ai[x];
else{
int mid = (st + dr) / 2;
if(qdr <= mid)
return query(x * 2, st, mid, qst, qdr);
if(mid + 1 <= qst)
return query(x * 2 + 1, mid + 1, dr, qst, qdr);
return max(query(x * 2, st, mid, qst, qdr), query(x * 2 + 1, mid + 1, dr, qst, qdr));
}
}
int main() {
fin >> n >> q;
for(int i = 1; i <= n; i++)
fin >> v[i];
build(1, 1, n);
while(q--){
fin >> t;
if(t == 0){
int st, dr;
fin >> st >> dr;
fout << query(1, 1, n, st, dr) << '\n';
}else{
int pos, x;
fin >> pos >> x;
update(1, 1, n, pos, x);
}
}
return 0;
}