#include <bits/stdc++.h>
using namespace std;
#ifndef DLOCAL
#define cin fin
#define cout fout
ifstream cin("arbint.in");
ofstream cout("arbint.out");
#endif
const int nmax = 1e5 + 5;
int n;
namespace AINT {
int aint[nmax * 4];
void construct(int *v, int node = 1, int cl = 1, int cr = n) {
if(cl == cr) {
aint[node] = v[cl];
return;
}
int mid = cl + cr >> 1;
construct(v, node * 2, cl, mid);
construct(v, node * 2 + 1, mid + 1, cr);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
void upd(int poz, int val, int node = 1, int cl = 1, int cr = n) {
if(cl == cr) {
aint[node] = val;
return;
}
int mid = cl + cr >> 1;
if(poz <= mid)
upd(poz, val, node * 2, cl, mid);
else
upd(poz, val, 2 * node + 1, mid + 1, cr);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
int query(int l, int r, int node = 1, int cl = 1, int cr = n) {
if(r < cl || cr < l)
return 0;
if(l <= cl && cr <= r)
return aint[node];
int mid = cl + cr >> 1;
return max(query(l, r, 2 * node, cl, mid), query(l, r, 2 * node + 1, mid + 1, cr));
}
};
int v[nmax];
int main() {
int q;
cin >> n >> q;
for(int i = 1; i <= n; i++)
cin >> v[i];
AINT::construct(v);
for(int i = 0, t, l, r; i < q; i++) {
cin >> t >> l >> r;
if(t == 0)
cout << AINT::query(l, r) << '\n';
else
AINT::upd(l, r);
}
return 0;
}