#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int NMAX=1e5;
const int NAINT=4*NMAX;
int n,m,t;
long long a,b,maxim;
long long aint[NAINT];
void build(int p, int st, int dr) {
if (st==dr) {
f >> aint[p];
return;
}
int m=(st+dr)/2, fs=2*p, fd=2*p+1;
build(fs, st,m);
build(fd, m+1,dr);
aint[p]=max(aint[fs],aint[fd]);
}
void query(int p, int st, int dr, int a, int b) {
if (a<=st && dr<=b) {
maxim=max(maxim,aint[p]);
return;
}
int m=(st+dr)/2, fs=2*p, fd=2*p+1;
if (a<=m) query(fs, st,m, a,b);
if (b>m) query(fd, m+1,dr, a,b);
}
void update(int p, int st, int dr, int poz, int x) {
if (st==dr) {
aint[p]=x;
return;
}
int m=(st+dr)/2, fs=2*p, fd=2*p+1;
if (poz<=m) update(fs, st,m, poz,x);
else update(fd, m+1,dr, poz,x);
aint[p]=max(aint[fs], aint[fd]);
}
int main()
{
f >> n >> m;
build(1,1,n);
for (int i=1;i<=m;i++) {
f >> t >> a >> b;
if (t==0) {
maxim=-1;
query(1,1,n,a,b);
g << maxim << '\n';
} else {
update(1,1,n,a,b);
}
}
return 0;
}