#include <bits/stdc++.h>
#define nMax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, tip, x, y, a[nMax], arb[4*nMax];
void build(int st, int dr, int nod)
{
if(st==dr)
arb[nod]=a[st];
else
{
int mid=(st+dr)>>1;
build(st, mid, 2*nod);
build(mid+1, dr, 2*nod+1);
arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}
}
void update(int st, int dr, int nod)
{
if(st==dr)
arb[nod]=y;
else
{
int mid=(st+dr)/2;
if(x<=mid)
update(st, mid, 2*nod);
else
update(mid+1, dr, 2*nod+1);
arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}
}
int query(int st, int dr, int nod, int x, int y)
{
if(x>y)
return 0;
if(st==x && dr==y)
return arb[nod];
int mid=(st+dr)/2;
return max(query(st, mid, 2*nod, x, min(mid, y)), query(mid+1, dr, 2*nod+1, max(mid+1, x), y));
}
int main()
{
fin >> n >> m;
for(int i=1; i<=n; i++)
fin >> a[i];
build(1, n, 1);
while(m--)
{
fin >> tip >> x >> y;
if(!tip)
fout << query(1, n, 1, x, y) << "\n";
else
update(1, n, 1);
}
return 0;
}