#include <fstream>
using namespace std;
#define sizez 100004
ifstream in("arbint.in");
ofstream out("arbint.out");
int A[4*sizez+30],a,b,m,n,tip;
int QueryAI(int,int,int,int,int);
void UpdateAI(int,int,int,int,int,int);
void ArboriDeIntervale()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
int val;
for(int i = 1 ; i<= n ; i++)
{
scanf("%d",&val);
UpdateAI(1,1,n,i,i,val);
}
while(m--)
{
scanf("%d%d%d",&tip,&a,&b);
if(tip)
UpdateAI(1,1,n,a,a,b);
else
printf("%d\n",QueryAI(1,1,n,a,b));
}
}
void UpdateAI(int nod, int st, int dr,int a, int b,int val)
{
if ( a<= st && dr <= b)
A[nod] = val;
else
{
int mij = (st + dr) / 2;
if( a <= mij)
UpdateAI( 2* nod , st, mij,a,b,val);
if( b> mij)
UpdateAI( 2* nod +1, mij+1, dr ,a,b,val);
A[nod] = max(A[2*nod],A[2*nod+1]);
}
}
int QueryAI(int nod, int st, int dr,int a, int b)
{
if (a <= st && dr <= b)
return A[nod];
else
{
int div = (st+dr)/2,maxa = 0, maxb= 0;
if ( a <= div )
maxa = QueryAI(2*nod,st,div,a,b);
if ( div < b )
maxb = QueryAI(2*nod+1,div+1,dr,a,b);
return max(maxa,maxb);
}
}
int main()
{
ArboriDeIntervale();
return 0;
}