#include <iostream>
using namespace std;
const int NMAX = 100002;
int N, M;
int a[NMAX], aint[4 * NMAX];
void build(int nod, int st, int dr){
if(st == dr)
{
aint[nod] = a[st];
return;
}
int m = (st + dr) / 2;
build(2 * nod, st, m);
build(2 * nod + 1, m + 1, dr);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
int query(int nod, int st, int dr, int qst, int qdr){
if(dr < qst || st > qdr)
return -1;
if(st >= qst && dr <= qdr)
return aint[nod];
int ansSt, ansDr, m;
m = (st + dr) / 2;
ansSt = query(2 * nod, st, m, qst, qdr);
ansDr = query(2 * nod + 1, m + 1, dr, qst, qdr);
return max(ansSt, ansDr);
}
void update(int nod, int st, int dr, int poz, int val){
if(poz < st || poz > dr)
return;
if(st == dr){
aint[nod] = val;
return;
}
int m = (st + dr) / 2;
update(2 * nod, st, m, poz, val);
update(2 * nod + 1, m + 1, dr, poz, val);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
freopen("aint.in", "r", stdin);
freopen("aint.out", "w", stdout);
cin >> N >> M;
for(int i = 1; i <= N; i ++)
cin >> a[i];
build(1, 1, N);
while(M --){
int type, qst, qdr;
cin >> type >> qst >> qdr;
if(type == 0)
cout << query(1, 1, N, qst, qdr) << '\n';
else
update(1, 1, N, qst, qdr);
}
return 0;
}