#include <fstream>
#include <algorithm>
#define NMAX 100000
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[4 * NMAX + 1];
int n, m;
void update(int poz, int val, int st, int dr, int i ) {
int mid = (st + dr) / 2;
if(st == dr )
aint[i] = val;
else {
if(poz <= mid)
update(poz, val, st, mid, i * 2 );
else
update(poz, val, mid + 1, dr, i * 2 + 1 );
aint[i] = max(aint[i * 2],aint[i * 2 + 1]);
}
}
int query(int a, int b, int st, int dr, int i ) {
if(a == st && b == dr)
return aint[i];
else {
int mid = ( st + dr ) / 2;
if(b <= mid)
query(a, b, st, mid, i * 2);
else
if(a > mid)
query(a, b, mid + 1, dr, i * 2 + 1);
else
return max(query( a, mid, st, mid, i * 2), query(mid + 1, b, mid + 1, dr, i * 2 + 1));
}
}
int main() {
fin >> n >> m;
for(int i = 1; i <= n; i++) {
int x;
fin >> x;
update(i, x, 1, n, 1);
}
for(int i = 1; i <= m; i++) {
int op, a, b;
fin >> op >> a >> b;
if(op == 1 )
update(a, b, 1, n, 1);
else
fout << query(a, b, 1, n, 1) << '\n';
}
}