#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arbInt[400000];
int raspuns;
int n, m;
//creez array cu valorile minime din arbore
void actualizare(int pozNod, int st, int dr, int poz, int val) {
if (st == dr) {
arbInt[pozNod] = val;
return ;
}
int mij = (st + dr) / 2;
if (poz <= mij)
actualizare(2 * pozNod, st, mij, poz, val);
else
actualizare(2 * pozNod + 1, mij + 1, dr, poz, val);
arbInt[pozNod] = max(arbInt[2 * pozNod], arbInt[2 * pozNod + 1]);
}
void intercalare(int pozNod, int st, int dr, int a, int b) {
if (a <= st && dr <= b) {
raspuns = max(raspuns, arbInt[pozNod]);
return ;
}
int mij = (st + dr) / 2;
if (a <= mij)
intercalare(2 * pozNod, st, mij, a, b);
if (b > mij)
intercalare(2 * pozNod + 1, mij + 1, dr, a, b);
}
int main(){
in >> n >> m;
for (int i = 1; i <= n; ++i) {
int temp;
in >> temp;
actualizare(1, 1, n, i, temp);
}
for (int i = 1; i <= m; ++i) {
int valid, a, b;
in >> valid >> a >> b;
if (valid == 0) {
raspuns = 0;
intercalare(1, 1, n, a, b);
out << raspuns << '\n';
} else {
actualizare(1, 1, n, a, b);
}
}
return 0;
}