#include <fstream>
#include <cassert>
#include <algorithm>
using namespace std;
#define MAXN 100001
int N, M, Val, maxx, MaxVal[2 * MAXN - 1];
string file = "arbint";
void update(int node, int left, int right, int pos)
{
if (left == right){
MaxVal[node] = Val;
return;
}
int mid = (left + right) / 2;
if (pos <= mid) update(node * 2, left, mid, pos);
else update(node * 2 + 1, mid + 1, right, pos);
MaxVal[node] = max(MaxVal[node * 2], MaxVal[node * 2 + 1]);
}
int query(int node, int left, int right, int a, int b)
{
if (a <= left && b >= right){
maxx = MaxVal[node];
return MaxVal[node];
}
int mid = (left + right) / 2;
if (a <= mid)
maxx = max(query(node * 2, left, mid, a, b), maxx);
if (b >= mid + 1)
maxx = max(query(node * 2 + 1, mid + 1, right, a, b), maxx);
return maxx;
}
int main()
{
fstream fin(file + ".in", ios::in);
fstream fout(file + ".out", ios::out);
fin >> N >> M;
for (int i = 1; i <= N; i++)
fin >> Val,
update(1, 1, N, i);
for (int i = 1, x, a, b; i <= M; i++, maxx = 0){
fin >> x >> a >> b;
if (!x) query(1, 1, N, a, b),
fout << maxx << "\n";
else Val = b, update(1, 1, N, a);
}
fout.close();
fin.close();
return 0;
}