#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int dim = 1e5;
int t[4 * dim + 2], M;
void build(int nod, int st, int dr){
if(st == dr){
in >> t[nod];
return;
}
int mij = (st + dr) >> 1;
build(nod << 1, st, mij);
build((nod << 1) + 1, mij + 1, dr);
t[nod] = max(t[nod << 1], t[(nod << 1) + 1]);
}
void update(int pos, int val, int nod, int st, int dr){
if(st == dr){
t[nod] = val;
return;
}
int mij = (st + dr) >> 1;
if(pos <= mij)
update(pos, val, nod << 1, st, mij);
else
update(pos, val, (nod << 1) + 1, mij + 1, dr);
t[nod] = max(t[nod << 1], t[(nod << 1) + 1]);
}
void query(int nod, int st, int dr, int start, int finish){
if(start <= st && dr <= finish){
M = max(M, t[nod]);
return;
}
int mij = (st + dr) >> 1;
if(start <= mij)
query(nod << 1, st, mij, start, finish);
if(mij < finish)
query((nod << 1) + 1, mij + 1, dr, start, finish);
}
main(){
int n, m, i, j, tip, a, b;
in >> n >> m;
build(1, 1, n);
while(m--){
in >> tip >> a >> b;
if(tip == 0){
M = -1;
query(1, 1, n, a, b);
out << M << '\n';
}
else
update(a, b, 1, 1, n);
}
return 0;
}