#include <iostream>
#include <fstream>
#define Nmax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[4*Nmax], ans, n, m, x, qu;
void upd(int nod, int l, int r, int poz, int val)
{
int middle = (l + r) / 2;
if(l == r)
{
arb[nod] = val;
return;
}
if(poz <= middle)
upd(2*nod, l, middle, poz, val);
else upd(2*nod + 1, middle + 1, r, poz, val);
arb[nod] = max(arb[2*nod], arb[2*nod + 1]);
}
void q(int nod, int left, int right, int L, int R)
{
int middle = (left + right) / 2;
if(L <= left && right <= R)
{
ans = max(ans, arb[nod]);
return;
}
if(left > R || right < L)
{
return;
}
q(2*nod, left, middle, L, R);
q(2*nod + 1, middle + 1, right, L, R);
}
int main()
{
int l, r;
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
fin >> x;
upd(1, 1, n, i, x);
}
for(int i = 1; i <= m; i++)
{
fin >> qu >> l >>r;
if(qu == 1)upd(1, 1, n, l, r);
else
{
ans = 0;
q(1, 1, n, l, r);
fout << ans <<'\n';
}
}
return 0;
}