#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX=1e5;
int aint[4*NMAX], a[NMAX];
int n, m;
void build(int nod, int st, int dr ) {
if (st == dr) {
aint[nod] = a[st];
} else {
int mij = (st + dr) / 2;
build(2*nod, st, mij);
build(2*nod+1, mij+1, dr);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
}
void update(int nod, int st, int dr, int pos, int val) {
if (st == dr) {
aint[nod] = val;
} else {
int mij = (st + dr) / 2;
if (pos <= mij) {
update(2*nod, st, mij, pos, val);
} else {
update(2*nod+1, mij+1, dr, pos, val);
}
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
}
int query(int nod, int st, int dr, int qst, int qdr) {
if (st>=qst && dr<=qdr) {
return aint[nod];
}
int mij = (st + dr) / 2, ans=0;
if (qst<=mij) {
ans=max(ans, query(2*nod, st, mij, qst, qdr));
}
if (mij<qdr) {
ans=max(ans, query(2*nod+1, mij+1, dr, qst, qdr));
}
return ans;
}
int main() {
int i, t, x, y;
fin>>n>>m;
for (i=1;i<=n;i++) {
fin>>a[i];
}
build(1, 1, n);
for (i=1;i<=m;i++) {
fin>>t>>x>>y;
if (t==1) {
update(1, 1, n, x, y);
} else {
fout<<query(1, 1, n, x, y)<<endl;
}
}
return 0;
}