#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100002;
int tree[4 * NMAX];
int a[NMAX];
int N,Q;
void Update(int nod, int lf, int rg, int pos, int val)
{
if ( lf == rg)
{
tree[nod] = val;
return ;
}
int mid = ( lf + rg ) / 2;
if(pos <= mid) Update(nod * 2, lf , mid, pos, val);
else Update( nod * 2 + 1, mid + 1, rg, pos , val);
tree[nod] = max ( tree[nod * 2], tree[nod * 2 + 1]);
}
int Query(int nod, int lf, int rg, int L, int R)
{
if(L <= lf && rg <= R)
return tree[nod];
int mid = ( lf + rg ) / 2;
int ans1,ans2;
ans1=ans2=0;
if(L <= mid) ans1 = Query(nod * 2, lf, mid, L, R);
if( R > mid) ans2 = Query(nod * 2 + 1, mid + 1, rg, L, R);
return max(ans1,ans2);
}
int x, y, task;
void Read()
{
fin >> N >> Q;
for(int i=1;i<=N;++i)
{
fin >> a[i];
Update(1,1,N,i,a[i]);
}
for(int i=1;i<=Q;++i)
{
fin >> task >> x >> y;
if( task == 1)
{
Update(1,1,N,x,y);
}
else
{
fout << Query(1,1,N,x,y) << "\n";
}
}
}
int main()
{
Read();
return 0;
}