#include <iostream>
#include<fstream>
using namespace std;
int madeUpTree[500000];
int theArray[100005];
void makeTree(int st, int dr,int index)
{
if(st == dr)
{
madeUpTree[index] = theArray[st];
return ;
}
int med = st + dr;
med = med / 2;
makeTree(st,med, index * 2 + 1);
int fNode = madeUpTree[index * 2 + 1];
makeTree(med + 1, dr, index * 2 + 2);
int sNode = madeUpTree[index * 2 + 2];
madeUpTree[index] = max(fNode, sNode);
}
void switchElemOfTree(int st,int dr, int wantedPos, int wantedVal, int index){
if(st == dr)
if(wantedPos == st)
madeUpTree[index] = wantedVal;
else
return ;
else
{
int med = (st + dr) / 2;
if(med >= wantedPos)
{
switchElemOfTree(st, med, wantedPos, wantedVal, 2 * index + 1);
madeUpTree[index] = max(madeUpTree[index * 2 + 1], madeUpTree[index * 2 + 2]);
}
else
{
switchElemOfTree(med + 1, dr, wantedPos, wantedVal, 2 * index + 2);
madeUpTree[index] = max( madeUpTree[index * 2 + 1], madeUpTree[index * 2 + 2]);
}
}
}
int getAnswer(int st,int dr, int wantedLeft, int wantedRight, int index){
if( wantedRight < st || wantedLeft > dr)
return 0;
if( wantedRight >= dr && wantedLeft <= st)
return madeUpTree[index];
int med = (st + dr) / 2;
int fElem = getAnswer(st, med, wantedLeft, wantedRight, index * 2 + 1);
int sElem = getAnswer(med + 1, dr, wantedLeft, wantedRight, index * 2 + 2);
return max(sElem, fElem);
}
int main()
{
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, events;
//n - length of array
fin>>n >> events;
int initSize = n;
for(int i = 0; i < n; i++)
fin>>theArray[i];
int st = 0;
int dr = n - 1;
makeTree(st,dr,0);
for(int i = 1; i <= events; i ++)
{
int op, st, dr;
fin>>op>>st>>dr;
-- st;
if(op == 1)
{
switchElemOfTree(0, n - 1, st, dr, 0);
}
if(op == 0)
{
-- dr;
fout<< getAnswer(0, n - 1, st, dr, 0)<<'\n';
}
}
fin.close();
fout.close();
return 0;
}