#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int segment[3000], arrial[3000],n,m,cer,a,b;
void bulid(int node, int left, int right)
{
if(left==right)
segment[node] = arrial[node];
else
{
int middle =(left+right)/2;
bulid(node*2, left, middle);
bulid(node*2+1, middle+1, right);
segment[node]= max(segment[node*2], segment[node*2+1]);
}
}
void update(int node, int left, int right, int position, int newval)
{
if(left==right)
{
segment[node] = newval;
}
else
{
int middle = (left+right)/2;
if(position<=middle)
update(node*2,left,middle, position, newval);
else
update(node*2+1,middle+1, right, position, newval);
}
}
int query(int node, int left, int right, int querryleft, int querryright)
{
if(querryleft <= left && right <= querryright)
return segment[node];
else
{
int middle = (left+right)/2;
if(querryright <=middle)
return query(node*2, left, middle, querryleft, querryright);
if(middle +1 <= querryleft)
return query(node*2+1, middle+1, right, querryleft, querryright);
return max(query(node*2, left, middle,querryleft, querryright), query(node*2+1, middle +1, right, querryleft, querryright));
}
}
int main()
{
f>>n>>m;
for(int i=1;i<=n;i++)
f>>arrial[i];
bulid(1,1,n);
for(int i=1;i<=m;i++)
{
f>>cer>>a>>b;
if(cer==1)
{
g<<query(1,1,n,a,b);
}
else
{
update(1,1,a,b);
}
}
return 0;
}