//#include <iostream>
#include <fstream>
#define DN 100005
using namespace std;
int v[DN], ai[4*DN];
void build(int poz, int ls, int ld)
{
if(ls == ld)
{
ai[poz] = v[ls];
return;
}
int m = (ls+ld)/2, fs=2*poz;
build(fs, ls, m);
build(fs+1, m+1, ld);
ai[poz] = max(ai[fs], ai[fs+1]);
}
int ma;
void query(int poz, int ls, int ld, int qls, int qld)
{
if(ld<qls || ls>qld) return;
if(qls<=ls && ld<=qld)
{
ma = max(ma, ai[poz]);
return;
}
int m = (ls+ld)/2, fs = 2*poz;
query(fs, ls, m, qls, qld);
query(fs+1, m+1, ld, qls, qld);
}
void update(int nc, int ls, int ld, int poz, int x)
{
if(ls == ld)
{
ai[nc] = x;
return;
}
int m = (ls+ld)/2, fs = 2*nc;
if(poz<=m) update(fs, ls, m, poz, x);
else update(fs+1, m+1, ld, poz, x);
ai[nc] = max(ai[fs], ai[fs+1]);
}
int main()
{
ifstream f("arbint.in");
ofstream cout("arbint.out");
int n, m;
f >> n >> m;
for(int i = 1; i <= n; ++i)
f >> v[i];
build(1, 1, n);
for(int i = 1; i <= m; ++i)
{
int x, y, z;
f >> x >> y >> z;
if(x)
update(1, 1, n, y, z);
else
{
ma = 0;
query(1, 1, n, y, z);
cout << ma << '\n';
}
}
return 0;
}