#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
#define NMAX 100000
int v[4*NMAX + 60];
//functie care actualizeaza valoarea elementului de pe pozitia poz cu val
void update(int nod, int st, int dr, int poz, int val)
{
if(st == dr)
v[nod] = val;
else
{
int mij = (st+dr)/2;
if(poz <= mij)
update(2*nod, st, mij, poz, val);
else
update(2*nod+1, mij+1, dr, poz, val);
v[nod] = max(v[2*nod], v[2*nod+1]);
}
}
//functie care determina valoarea maxima din intervalul [a,b] si o pune in rez
void query(int nod, int st, int dr, int a, int b, int &rez)
{
if(a <= st && dr <= b)
rez = max(rez, v[nod]);
else
{
int mij = (st+dr)/2;
if(a <= mij)
query(2*nod, st, mij, a, b, rez);
if(mij < b)
query(2*nod+1, mij+1, dr, a, b, rez);
}
}
int main()
{
fin >> n >> m;
cerr << n << " " << m;
for(int i=1; i<=n; ++i)
{
int x;
fin >> x;
update(1, 1, n, i, x);
}
for(int i=1; i<=m; ++i)
{
int operatie, a, b;
fin >> operatie >> a >> b;
if(operatie == 1)
update(1, 1, n, a, b);
else
{
int rez = 0;
query(1, 1, n, a, b, rez);
fout << rez << "\n";
}
}
return 0;
}