#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int nmax = 100000;
int v[nmax + 5];
int a[4 * nmax + 5];
void build(int nod, int st, int dr) {
if (st==dr) {
a[nod]= v[st];
return;
}
int mid = (st+dr) /2;
build(nod*2, st , mid);
build(nod * 2 + 1, mid +1, dr);
a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
}
void update(int nod, int st, int dr,int poz, int val)
{
if (st==dr) {
a[nod] = val;
return;
}
int mid = (st+dr)/2;
if (poz <= mid) update(nod * 2, st , mid, poz, val);
else update(nod * 2 + 1, mid + 1, dr , poz , val);
a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
}
int query(int nod, int st, int dr, int l, int r)
{
if (l <= st && dr <=r)
return a[nod];
int mid = (st+dr) /2;
int mx = -1;
if (l <= mid) mx = max(mx, query(nod * 2, st, mid, l, r));
if (r > mid) mx = max(mx, query(nod * 2 + 1, mid + 1, dr, l ,r));
return mx;
}
int main()
{
int n, m;
fin>>n>>m;
for (int i = 1; i <= n; i++)
fin>>v[i];
build(1,1,n);
for (int i = 1; i <= m; i++) {
int t;
fin>>t;
if (!t) {
int st,dr;
fin>>st>>dr;
fout<<query(1,1,n, st, dr)<<'\n';
continue;
}
int poz, val;
fin>>poz>>val;
update(1,1,n,poz,val);
}
}