#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m,a[100005],aint[400005];
void build(int nod,int l,int r)
{
if (l == r)
aint[nod] = a[l];
else
{
int mij = (l + r) / 2;
build(2 * nod,l,mij);
build(2 * nod + 1,mij + 1,r);
aint[nod] = max(aint[2 * nod],aint[2 * nod + 1]);
}
}
void update(int nod,int l,int r,int pos,int val)
{
if (l == r)
aint[nod] = val;
else
{
int mij = (l + r) / 2;
if (pos <= mij)
update(2 * nod,l,mij,pos,val);
else
update(2 * nod + 1,mij + 1,r,pos,val);
aint[nod] = max(aint[2 * nod],aint[2 * nod + 1]);
}
}
int query(int nod,int l,int r,int st,int dr)
{
if (r < st or dr < l)
return 0;
if (st <= l and r <= dr)
return aint[nod];
int mij = (l + r) / 2;
return max(query(2 * nod,l,mij,st,dr),query(2 * nod + 1,mij + 1,r,st,dr));
}
int main()
{
in >> n >> m;
for (int i = 1; i <= n; i++)
in >> a[i];
build(1,1,n);
for (int i = 1; i <= m; i++)
{
int tip,x,y;
in >> tip >> x >> y;
if (tip == 0)
out << query(1,1,n,x,y) << '\n';
else
update(1,1,n,x,y);
}
return 0;
}