#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAXN = 1e5 + 3;
int aint[4 * MAXN], v[MAXN], n, m, maxim;
void update(int p, int left, int right, int st, int dr){
if(right - left <= 0){
aint[p] = dr;
return;
}
int m = (left + right) / 2;
if(st <= m) update(2 * p, left, m, st, dr);
else update(2 * p + 1, m + 1, right, st, dr);
aint[p] = max(aint[2 * p], aint[2 * p + 1]);
}
void query(int p, int left, int right, int st, int dr){
if(st <= left and right <= dr){
maxim = max(maxim , aint[p]);
return;
}
int m = (left + right) / 2;
if(m < dr) query(2 * p + 1, m + 1, right, st, dr);
if(m >= st) query(2 * p, left, m, st, dr);
}
int main(){
fin >> n >> m;
for(int i = 1; i <= n; ++i){
fin >> v[i];
update(1, 1, n, i, v[i]);
}
for(int i = 1; i <= m; ++i){
int type, x, y;
fin >> type >> x >> y;
if(type){
update(1, 1, n, x, y);
}
else{
query(1, 1, n, x, y);
fout << maxim << '\n';
maxim = 0;
}
}
return 0;
}