#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define MAX 100005
int a[MAX];
int arbint[4 * MAX];
void build(int nod, int st, int dr)
{
if (st == dr)
{
arbint[nod] = a[st];
return;
}
int mid = st + (dr - st) / 2;
build(2 * nod, st, mid);
build(2 * nod + 1, mid + 1, dr);
arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}
void update(int nod, int st, int dr, int poz, int val)
{
if (st == dr)
{
arbint[nod] = val;
return;
}
int mid = st + (dr - st) / 2;
if (poz <= mid) update(2 * nod, st, mid, poz, val);
else update(2 * nod + 1, mid + 1, dr, poz, val);
arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}
int query(int nod, int st, int dr, int a, int b)
{
if (a <= st && dr <= b) return arbint[nod];
int mid = st + (dr - st) / 2;
int max_st = -1, max_dr = -1;
if (a <= mid) {
max_st = query(2 * nod, st, mid, a, b);
}
if (b > mid) {
max_dr = query(2 * nod + 1, mid + 1, dr, a, b);
}
return max(max_st, max_dr);
}
int main(void)
{
int n, m, x, y, op;
fin >> n >> m;
for (int i=1; i <= n; i++) fin >> a[i]; //indexam de la 1
build(1, 1, n);
for (int i=0; i < m; i++)
{
fin >> op >> x >> y;
if (!op) fout << query(1, 1, n, x, y) << endl;
else update(1, 1, n, x, y);
}
return 0;
}