#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int aint[400005];
int v[100005];
void build(int node , int l , int r)
{
if(l > r)
return;
if(l == r)
{aint[node] = v[l];
return;}
int mid = (l + r)/2;
build(2 * node , l , mid);
build(2 * node + 1 , mid + 1 , r);
aint[node] = max(aint[2 * node] , aint[2*node+1]);
}
void update(int node , int l , int r , int poz , int val)
{
if(l > r || poz >r || poz < l)
return;
if(l == r)
{aint[node] = val;
return;}
int mid = (l + r)/2;
update( 2 * node , l , mid , poz , val);
update(2 * node + 1 , mid + 1 ,r , poz , val);
aint[node] = max(aint[2 * node] , aint[2 * node + 1]);
}
int query(int node , int l , int r , int ql , int qr)
{
if(l > r || l > qr || r < ql)
return -1;
if(ql <= l && r <= qr)
return aint[node];
int mid = (l + r) / 2 , maxim;
maxim = max(query( 2 * node , l , mid , ql , qr) ,
query(2 * node + 1 , mid + 1 , r , ql , qr));
return maxim;
}
int main()
{
int n, m , i , tip , a , b;
cin >> n >> m;
for(i = 1; i <= n; i++)
cin >> v[i];
build(1,1,n);
for(i = 1;i <= m;i++)
{
cin >> tip >> a >> b;
if(tip == 0)
cout << query(1,1,n,a,b) << "\n";
else
update(1,1,n,a,b);
}
return 0;
}