#include<iostream>
#include<fstream>
#include<vector>
#define MIN_VAL -100
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
std::vector<int> arr;
std::vector<int> vec;
int maxx;
void update(int x,int y,int pos,int up_pos)
{
if(x == y)
{
arr[pos] = vec[x];
return;
}
int middle = (x+y)/2;
if(up_pos <= middle) update(x,middle,2*pos+1,up_pos);
else update(middle+1,y,2*pos+2,up_pos);
arr[pos] = max(arr[2*pos+1],arr[2*pos+2]);
}
void range_query(int x,int y,int x1,int y1,int pos)
{
if(x >= x1 && y <= y1)
{
if(arr[pos] > maxx) maxx = arr[pos];
return;
}
int middle = (x+y)/2;
if(x1 <= middle) range_query(x,middle,x1,y1,2*pos+1);
if(y1 > middle) range_query(middle+1,y,x1,y1,2*pos+2);
//else return range_query(middle+1,y,x1,y1,2*pos+2);
}
/*int range_query(int x,int y,int pos,int x1,int y1)
{
if(x >= x1 && y <= y1) return arr[pos];
if(x > y1 || y < x1) return MIN_VAL;
return max(range_query(x,(x+y)/2,2*pos+1,x1,y1),range_query(((x+y)/2)+1,y,2*pos+2,x1,y1));
}*/
void print_arr()
{
for(int i=0;i<arr.size();i++) cout<<arr[i]<<" ";
cout<<"\n";
}
int n,m;
int main()
{
fin>>n>>m;
int k1;
arr.assign(4*n,0);
for(int i=0;i<n;i++)
{
fin>>k1;
vec.push_back(k1);
update(0,n-1,0,vec.size()-1);
}
for(int i=0;i<m;i++)
{
int k2,k3;
fin>>k1>>k2>>k3;
if(k1 == 0)
{
maxx = MIN_VAL;
range_query(0,n-1,k2-1,k3-1,0);
fout<<maxx<<"\n";
}
else if(k1 == 1)
{
vec[k2-1] = k3;
update(0,n-1,0,k2-1);
//print_arr();
}
}
//cout<<range_query(0,n-1,0,2,0);
}