#include <fstream>
#include <cstdio>
#define DIM 200001
using namespace std;
int n, m, v[DIM], x, y, t;
void update(int k, int poz, int value, int left, int right)
{
if(left == right) v[k] = value;
else
{
int mid = (left + right) / 2;
if(poz <= mid) update(k * 2, poz, value, left, mid);
else update(k * 2 + 1, poz, value, mid + 1, right);
v[k] = max(v[k * 2], v[k * 2 + 1]);
}
}
int query(int k, int a, int b, int left, int right)
{
if(a <= left && b >= right) return v[k];
int mid = (left + right) / 2;
if(b <= mid) return query(k * 2, a, b, left, mid);
if(a > mid) return query(k * 2 + 1, a, b, mid, right);
return max(query(k * 2, a, mid, left, mid), query(k * 2 + 1, mid + 1, b, mid + 1, right));
}
int main()
{
//ifstream f("arbint.in");
//ofstream g("arbint.out");
FILE * f=fopen("arbint.in", "r");
FILE * g=fopen("arbint.out", "w");
//f >> n >> m;
fscanf(f, "%d %d", &n, &m);
for(int i = 1; i <= n; ++i)
{
//f >> x;
fscanf(f, "%d", &x);
update(1, i, x, 1, n);
}
for(int i = 1; i <= m; ++i)
{
//f >> t >> x >> y;
fscanf(f, "%d %d %d", &t, &x, &y);
if(t == 1) update(1, x, y, 1, n);
else //g << query(1, x, y, 1, n) << '\n';
fprintf(g, "%d", query(1, x, y, 1, n));
}
//f.close();
//g.close();
fclose(f);
fclose(g);
return 0;
}