#include <fstream>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
const int Nmax=400005;
int n,m,A[Nmax],maxim;
void Query (int nod,int left, int right, int start, int finish)
{
if (left>=start&&right<=finish)
{
maxim=max(maxim,A[nod]);
return;
}
int mid=(left+right)/2;
if(mid>=start)
{
Query(2*nod,left,mid,start,finish);
}
if (mid<finish)
{
Query(2*nod+1,mid+1,right,start,finish);
}
}
void Update(int nod,int left,int right, int pos, int val)
{
if (left==right)
{
A[nod]=val;
return;
}
int mid=(left+right)/2;
if (pos<=mid)
{
Update(2*nod,left,mid,pos,val);
}
else
{
Update(2*nod+1,mid+1,right,pos,val);
}
A[nod]=max(A[2*nod],A[2*nod+1]);
}
void RSP()
{
int x,y,opt;
in>>n>>m;
for(int i=1;i<=n;i++)
{
in>>x;
Update(1,1,n,i,x);
}
for (int i=1;i<=m;i++)
{
in>>opt>>x>>y;
if (opt==1)
{
Update(1,1,n,x,y);
}
else
{
maxim=-1;
Query(1,1,n,x,y);
out<<maxim<<'\n';
}
}
}
int main()
{
RSP();
return 0;
}