#include <fstream>
using namespace std;
int intArb[100000], v[400004];
int interogare(int nod, int st, int dr, int a, int b) {
if (a > dr || b < st || st > dr)
return -1;
if (st >= a && dr <= b)
return v[nod];
int k = interogare(2*nod, st, (st+dr)/2, a, b);
int j = interogare(2*nod+1, (st+dr)/2+1, dr, a, b);
if (k == -1)
return j;
if (j == -1)
return k;
if (intArb[j] > intArb[k])
return j;
return k;
}
void actualizare(int nod, int st, int dr, int ind) {
if (ind < st || ind > dr)
return;
if (st == dr) {
v[nod] = st;
} else {
actualizare(2*nod, st, (st+dr)/2, ind);
actualizare(2*nod+1, (st+dr)/2+1, dr, ind);
if(intArb[v[2*nod]] > intArb[v[2*nod+1]]) {
v[nod] = v[2*nod];
} else {
v[nod] = v[2*nod+1];
}
}
}
void init(int nod, int st, int dr) {
if (st < 0)
return;
if (st == dr) {
v[nod] = st;
} else {
init(2*nod, st, (st+dr)/2);
init(2*nod+1, (st+dr)/2+1, dr);
if (intArb[v[2*nod]] > intArb[v[2*nod+1]]) {
v[nod] = v[2*nod];
} else {
v[nod] = v[2*nod+1];
}
}
}
int main()
{
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, op, a, b;
fin >> n >> m;
for (int i = 0; i < n; i++) {
fin >> intArb[i];
}
init(1, 0, n-1);
for (int i = 0; i < m; i++) {
fin >> op >> a >> b;
if (op == 0) {
fout << intArb[interogare(1, 0, n-1, a-1, b-1)] << '\n';
} else {
intArb[a-1] = b;
actualizare(1, 0, n-1, a-1);
}
}
return 0;
}