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