#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int i, n, m, v[4 * 100010], op, a, b, x, Sol, poz;
void update(int nod, int st, int dr, int poz, int x){
if(st == dr)
{
v[nod] = x;
return ;
}
else
{
int mid = (st + dr) / 2;
if(poz <= mid)
update(2 * nod, st, mid, poz, x);
else
update(2 * nod + 1, mid + 1, dr, poz, x);
v[nod] = max(v[2 * nod], v[2 * nod + 1]);
}
}
void query(int nod, int st, int dr, int a, int b){
if(a <= st && b >= dr)
{
Sol = max(v[nod],Sol);
return ;
}
int mid = (st + dr) / 2;
if(a <= mid)
query(2 * nod, st, mid, a, b);
if(b > mid)
query(2 * nod + 1, mid + 1, dr, a ,b);
}
int main()
{
fin >> n >> m;
for(i = 1; i <= n; i ++){
fin >> x;
update(1,1,n,i,x);
}
for(i = 1; i <= m; i ++)
{
Sol = 0;
fin >> op;
if(op == 1)
{
fin >> poz >> x;
update(1,1,n,poz,x);
}
else
{
fin >> a >> b;
query(1,1,n,a,b);
fout << Sol << '\n';
}
}
return 0;
}