#include <fstream>
#include <cstdlib>
#include <cstdio>
#define MAX_SIZE 100000
int arb[MAX_SIZE * 3];
int N , NR_OP;
int maxval = -1;
int maxim(int a , int b)
{
if (a > b) return a;
else return b;
}
void Update_Tree(int nod , int value ,int vector_pos , int left , int right)
{
if (left == right)
{
arb[nod] = value;
return;
}
int middle = (left + right) / 2;
if (vector_pos <= middle )
{
Update_Tree(2*nod,value,vector_pos,left,middle);
}
else
{
Update_Tree(2*nod + 1,value,vector_pos,middle+1,right);
}
arb[nod] = maxim(arb[2*nod],arb[2*nod+1]);
}
void Query_Tree(int nod , int A , int B , int left , int right)
{
if (A <= left && right <= B)
{
if (maxval < arb[nod])
{
maxval = arb[nod];
}
return;
}
int middle = (left + right) / 2;
if (A <= middle) Query_Tree(2*nod,A,B,left,middle);
if (B > middle ) Query_Tree(2*nod+1,A,B,middle+1,right);
}
using namespace std;
int main()
{
ifstream input("arbint.in");
ofstream output("arbint.out");
input >> N >> NR_OP;
for (int i=1;i<=N;i++)
{
int x;
input >> x;
Update_Tree(1,x,i,1,N);
}
for (int i = 0;i<NR_OP;i++)
{
int x;
input >> x;
if (x == 0)
{
int start , finish;
input >> start >> finish;
maxval = -1;
Query_Tree(1,start,finish,1,N);
output << maxval << "\n";
}
if (x == 1)
{
int poz;
int val;
input >> poz >> val;
Update_Tree(1,val,poz,1,N);
}
}
input.close();
output.close();
return 0;
}