#include<bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N_max= 100000;
int MaxArb[4*N_max+1],start,finish,n,m,bonus,com,nr,val,pozitie;
void Update(int nod, int left, int right,int pos,int val)
{
if ( left == right )
{
MaxArb[nod] = val;
return;
}
int middle = (left+right)/2;
if ( pos <= middle )
Update(2*nod,left,middle,pos,val);
else
Update(2*nod+1,middle+1,right,pos,val);
MaxArb[nod] = max(MaxArb[2*nod], MaxArb[2*nod+1]);
}
void Query_max(int nod, int left,int right,int limitleft,int limitright,int &maxim)
{
/*if (left > right || left>limitright || right < limitleft)
return;*/
if(limitleft<=left && right<=limitright)
{
if(MaxArb[nod]>maxim)
maxim=MaxArb[nod];
return;
}
int middle= (left+right)/2;
if(limitleft<=middle)
Query_max(2*nod,left,middle,limitleft,limitright,maxim);
if(middle<limitright)
Query_max(2*nod+1,middle+1,right,limitleft,limitright,maxim);
}
void UpdateVal(int nod,int left,int right, int pozitie, int val)
{
if(left==right){
MaxArb[nod]=val;
return;
}
else{
int middle= (left+right)/2;
if(pozitie<=middle)
UpdateVal(2*nod,left,middle,pozitie,val);
else
UpdateVal(2*nod+1,middle+1,right,pozitie,val);
MaxArb[nod]= max(MaxArb[2*nod],MaxArb[2*nod+1]);
}
}
int main()
{
f>>n>>m;
for(int i=1; i<=n; i++)
{
f>>nr;
Update(1,1,n,i,nr);
}
for(int i=1; i<=m; i++)
{
f>>com;
if(com == 0)
{
f>>start>>finish;
int maxim=-1;
Query_max(1,1,n,start,finish,maxim);
g<<maxim<<'\n';
}
else
{
f>>pozitie;
f>>val;
UpdateVal(1,1,n,pozitie,val);
}
}
return 0;
}