#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
//v[4N] sau v[2^i] i-cea mai mica putere a lui 2 a i 2^i>n
int v[400001],n,m,a[100001],poz,val,x,y;
void build(int node,int left,int right)//[left,right]
{ if(left==right)
{v[node]=a[left];
return;
}
int middle=(left+right)/2;
build(2*node,left,middle);
build(2*node+1,middle+1,right);
v[node]=max(v[2*node],v[2*node+1]);}
//update x,y a[x]=y;
void update(int node,int left,int right,int poz,int val){
if(left==right)
{v[node]=val;
return;}
int middle=(left+right)/2;
if(poz<=middle)
update(2*node,left,middle,poz,val);
else
update(2*node+1,middle+1,right,poz,val);
v[node]=max(v[2*node],v[2*node+1]);}
//query x,y ->max(x,y)
int MAX=0;
void query(int node,int left,int right,int x,int y){
if(left>=x&&right<=y)
{MAX=max(MAX,v[node]);
return;}
int middle=(left+right)/2;
if(x<=middle)
query(2*node,left,middle,x,y);//merg pe fiul stang
if(y>middle)
query(2*node+1,middle+1,right,x,y);//merg pe fiul drept
}
int main(){
int i,op;
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>a[i];
build(1,1,n);
for(i=1;i<=m;i++)
{fin>>op>>x>>y;
if(op==1)
update(1,1,n,x,y);
else
{MAX=0;
query(1,1,n,x,y);
fout<<MAX<<"\n";}}
return 0;
}