#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int DIM = 100005;
int v[DIM], aint[4*DIM];
int n, q, op, x, y, sol;
void build(int nod, int st, int dr){
if(st == dr){
aint[nod] = v[st];
return;
}
int md = (dr - st) / 2 + st;
build(2*nod , st , md);
build(2*nod+1, md+1, dr);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
void update(int nod, int st, int dr, int poz, int k){
if(st == dr){
aint[nod] = k;
return;
}
int md = (dr - st) / 2 + st;
if(poz <= md)
update(2*nod , st , md, poz, k);
else
update(2*nod+1, md+1, dr, poz, k);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
void query(int nod, int st, int dr, int lft, int rgt){
if(lft <= st && dr <= rgt){
sol = max(sol, aint[nod]);
return;
}
int md = (dr - st) / 2 + st;
if(lft <= md)
query(2*nod , st , md, lft, rgt);
if(rgt > md)
query(2*nod+1, md+1, dr, lft, rgt);
}
int main (){
fin>>n>>q;
for(int i=1; i<=n; i++)
fin>>v[i];
build(1, 1, n);
while(q--){
fin>>op>>x>>y;
if(op == 0){
sol = 0;
query (1, 1, n, x, y);
fout<<sol<<"\n";
}else
update(1, 1, n, x, y);
}
return 0;
}
/*
1(1, 8)
2(1, 4) 3(5, 8)
4(1, 2) 5(3, 4) 6(5, 6) 7(7, 8)
8(1, 1) 9(2, 2) 10(3, 3) 11(4, 4) 12(5, 5) 13(6, 6) 14(7, 7) 15(8, 8)
*/