#include <fstream>
using namespace std;
const int NMAX = 400010;
int v[NMAX], numere[100001];
int n, m, i, j, k, l, q;
int a, b, val, poz;
//a, b pt query si val / poz pt update
int maxim(int x, int y){
if (x > y)
return x;
return y;
}
void tamise(int p, int st, int dr);
void update(int p, int st, int dr);
int query (int p, int st, int dr);
int main(){
ifstream in("arbint.in");
ofstream out("arbint.out");
in >> n >> m;
for (i = 1; i <= n; i++)
in >> numere[i];
tamise(1, 1, n);
while (m--){
in >> k;
if (k == 0){
in >> a >> b;
out << query(1, 1, n) << '\n';
}
else{
in >> poz >> val;
update(1, 1, n);
}
}
return 0;
}
int query (int p, int st, int dr){
if (a <= st && b >= dr)
return v[p];
int r = -2000000000;
if (a <= (st + dr) / 2)
r = query(2 * p, st, (st + dr) / 2);
if (b > (st + dr) / 2)
r = maxim(r, query(2 * p + 1, (st + dr) / 2 + 1, dr));
return r;
}
void update(int p, int st, int dr){
if (st == dr){
v[p] = val;
return;
}
if (poz <= (st + dr) / 2)
update(2 * p, st, (st + dr) / 2);
else
update(2 * p + 1, (st + dr) / 2 + 1, dr);
v[p] = maxim(v[2 * p], v[2 * p + 1]);
return;
}
void tamise(int p, int st, int dr){
if (st == dr){
v[p] = numere[st];
return;
}
tamise(2 * p, st, (st + dr) / 2);
tamise(2 * p + 1, (st + dr) / 2 + 1, dr);
v[p] = maxim(v[2 * p], v[2 * p + 1]);
return;
}