#include<bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define cin fin
#define cout fout
#define N 100005
int arborint[N*4], n, m, x, cerinta, a, b;
void update(int poz,int val, int nod, int in, int sf)
{
if(in == sf)
{
if(in == poz)arborint[nod] = val;
return ;
}
int mij = (in+sf)/2;
if(in <= poz && poz <= mij)update(poz,val,2*nod,in,mij);
if(mij < poz && poz <= sf)update(poz,val,2*nod+1,mij+1,sf);
arborint[nod] = max(arborint[2*nod],arborint[2*nod+1]);
}
int query(int st, int dr, int nod, int in, int sf)
{
if(st <= in && dr >= sf)
return arborint[nod];
int mij = (in+sf)/2;
if(mij < st)
{
return query(st,dr,2*nod+1,mij+1,sf);
}
if(mij >= dr)
{
return query(st,dr,2*nod,in,mij);
}
return max(query(st,dr,2*nod+1,mij+1,sf),query(st,dr,2*nod,in,mij));
}
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= n ; i++)
{
cin >> x;
update(i,x,1,1,n);
}
for(int i = 1 ; i <= m ; i++)
{
cin >> cerinta >> a >> b;
if(cerinta == 1)
{
update(a,b,1,1,n);
}
else
{
cout << query(a,b,1,1,n) << '\n';
}
}
return 0;
}