#include <iostream>
#include <fstream>
#define maxN 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, maxim;
int ARB[4*maxN + 66];
void Update (int nod, int left, int right, int val, int poz) {
if (left == right) {
ARB[nod] = val;
return;
}
else {
int mid = (left + right)/2;
if (poz <= mid)
Update(2*nod, left, mid, val, poz);
else
Update(2*nod+1, mid+1, right, val, poz);
}
ARB[nod] = max(ARB[2*nod], ARB[2*nod+1]);
}
void Query (int nod, int left, int right, int a, int b) {
if (a <= left and right <= b) {
if (ARB[nod] > maxim)
maxim = ARB[nod];
//return;
}
else {
int mid = (left+ right)/2;
if (a <= mid)
Query(2*nod, left, mid, a, b);
if (mid < b)
Query(2*nod+1, mid+1, right, a, b);
}
}
int main () {
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
int val;
fin >> val;
Update(1, 1, n, val, i);
}
for (int i = 1; i <= m; ++i) {
int Q;
fin >> Q;
if (Q == 0) {
maxim = -1;
int a, b;
fin >> a >> b;
Query(1, 1, n, a, b);
fout << maxim << '\n';
}
else {
int a, b;
fin >> a >> b;
Update(1, 1, n, b, a);
}
}
return 0;
}