#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m;
int arb[400006];
void update(int st, int dr, int nod, int val, int poz){
if(st == dr){
arb[nod] = val;
} else {
int m = (st + dr) / 2;
if(poz <= m)
update(st, m, 2 * nod, val, poz);
else update(m + 1, dr, 2 * nod + 1, val, poz);
arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
}
void query(int st, int dr, int start, int finish, int nod, int &mx){
if(start <= st && dr <= finish){
mx = max(arb[nod], mx);
return;
} else {
int m = (st + dr) / 2;
if(start <= m)
query(st, m, start, finish, 2 * nod, mx);
if(m < finish)
query(m + 1, dr, start, finish, 2 * nod + 1, mx);
}
}
int main()
{
int i, x, a, b;
f >> n >> m;
for(i = 1; i <= n; ++i){
f >> x;
update(1, n, 1, x, i);
}
for(i = 1; i <= m; ++i){
f >> x >> a >> b;
if(x == 0){
int mx = 0;
query(1, n, a, b, 1, mx);
g << mx << '\n';
} else {
update(1, n, 1, b, a);
}
}
return 0;
}