#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int nmax = 100001;
int a[nmax], d[nmax * 4];
int n, m;
void build(int st, int dr, int v);
int maxx(int v, int st, int dt, int str, int drr);
void update(int v, int poz, int val, int st, int dr);
int main()
{
in >> n >> m ;
for ( int i = 1; i <= n; ++i )
in >> a[i];
build(1, n, 1);
for ( int i = 1; i <= m; ++i )
{
int cr, st, dr;
in >> cr >> st >> dr;
if ( cr == 0 )
out << maxx(1, 1, n, st, dr) << "\n";
else update(1, st, dr, 1, n);
}
return 0;
}
void build(int st, int dr, int v)
{
if ( st == dr )
{
d[v] = a[st];
}
else
{
int mij = ( st + dr)/2;
build(st, mij, v * 2);
build(mij + 1, dr, v * 2 + 1);
d[v] = max(d[v * 2], d[v * 2 + 1]);
}
}
int maxx(int v, int st, int dr, int str, int drr)
{
int rez = 0;
if ( str > drr )
return 0;
if ( st == str and dr == drr )
return d[v];
int mij = ( st + dr ) / 2;
rez = std::max( maxx(v * 2, st, mij, str, min(drr, mij)), maxx(v * 2 + 1, mij + 1, dr, max(mij + 1, str), drr));
return rez;
}
void update(int v, int poz, int val, int st, int dr)
{
if ( st == dr )
d[v] = val;
else
{
int mij = ( st + dr ) / 2;
if ( poz <= mij )
update(v * 2, poz, val, st, mij);
else update( v * 2 + 1, poz, val, mij + 1, dr);
d[v] = max(d[v * 2], d[v * 2 + 1]);
}
}