#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#include <map>
#define NMAX 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int arb[2 * NMAX], v[NMAX];
int max(int a, int b) {
return (a > b) ? a : b;
}
void update(int index, int val,int i,int j,int k=1) {
if (i == index && j == index) { arb[k] = val; return; }
int m = (i + j) / 2;
if (index <= m) {
update(index, val, i, m, 2 * k);
}
else update(index, val, m + 1, j, 2 * k + 1);
arb[k] = max(arb[2 * k], arb[2 * k + 1]);
}
int buildArb(int i,int j,int k=1) {
if (i == j) { arb[k] = v[i]; return arb[k]; }
int m = (i + j) / 2;
int left = buildArb(i, m, 2 * k);
int right = buildArb(m + 1, j, 2 * k + 1);
arb[k] = max(left, right);
return arb[k];
}
int getMax(int left, int right, int i, int j,int k=1) {
if (i > right || j < left) return -1;
if (i >= left && j <= right) return arb[k];
int m = (i + j) / 2;
int x = getMax(left, right, i, m, 2 * k);
int y = getMax(left, right, m + 1, j, 2 * k + 1);
return max(x, y);
}
int main()
{
fin >> n >> m;
for (int i = 1;i <= n;++i)
fin >> v[i];
buildArb(1, n);
while (m--) {
int t, x, y;
fin >> t >> x >> y;
if (t == 0)
fout << getMax(x, y, 1, n) << '\n';
else update(x, y, 1, n);
}
return 0;
}