#include<bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
vector<int> v;
int intervalTree[300005];
void BuildIntervalTree(int st, int dr, int nodePosition);
int GetMaxValueInRange(int leftRangeLimit, int rightRangeLimit, int st, int dr, int nodePosition);
int UpdateIntervalTree(int position, int value, int nodePosition, int st, int dr);
int main()
{
fin >> n >> m;
for(int i = 0; i < n; i++)
{
int x;
fin >> x;
v.push_back(x);
}
BuildIntervalTree(0, n-1, 0);
for(int i = 0; i < m; i++)
{
int questionType;
fin >> questionType;
if(questionType==0)
{
int leftRangeLimit, rightRangeLimit;
fin >> leftRangeLimit >> rightRangeLimit;
fout << GetMaxValueInRange(leftRangeLimit-1, rightRangeLimit-1, 0, n-1, 0) << '\n';
}
else
{
int position, value;
fin >> position >> value;
v[position] = value;
UpdateIntervalTree(position-1, value, 0, 0, n-1);
}
}
}
int UpdateIntervalTree(int position, int value, int nodePosition, int st, int dr)
{
if(st==dr)
{
intervalTree[nodePosition] = value;
return value;
}
int mij = (st+dr)/2;
int leftNodePosition = nodePosition*2+1;
int rightNodePosition = nodePosition*2+2;
if(position<=mij)
{
intervalTree[leftNodePosition] = UpdateIntervalTree(position, value, leftNodePosition, st, mij);
}
else
{
intervalTree[rightNodePosition] = UpdateIntervalTree(position, value, rightNodePosition, mij+1, dr);
}
int leftNodeValue = intervalTree[leftNodePosition];
int rightNodeValue = intervalTree[rightNodePosition];
intervalTree[nodePosition] = max(leftNodeValue, rightNodeValue);
return intervalTree[nodePosition];
}
int GetMaxValueInRange(int leftRangeLimit, int rightRangeLimit, int st, int dr, int nodePosition)
{
if(leftRangeLimit<=st && rightRangeLimit>=dr)
{
return intervalTree[nodePosition];
}
int mij = (st+dr)/2;
int leftNodeValue, rightNodeValue;
if(leftRangeLimit>mij)
{
leftNodeValue = 0;
}
else
{
int leftNodePosition = nodePosition*2+1;
leftNodeValue = GetMaxValueInRange(leftRangeLimit, rightRangeLimit, st, mij, leftNodePosition);
}
if(rightRangeLimit <= mij)
{
rightNodeValue = 0;
}
else
{
int rightNodePosition = nodePosition*2+2;
rightNodeValue = GetMaxValueInRange(leftRangeLimit, rightRangeLimit, mij+1, dr, rightNodePosition);
}
return max(leftNodeValue, rightNodeValue);
}
void BuildIntervalTree(int st, int dr, int nodePosition)
{
if(st==dr)
{
intervalTree[nodePosition] = v[st];
return;
}
int mij = (st+dr)/2;
int leftNodePosition = nodePosition*2+1;
int rightNodePosition = nodePosition*2+2;
BuildIntervalTree(st, mij, leftNodePosition);
BuildIntervalTree(mij+1, dr, rightNodePosition);
intervalTree[nodePosition] = max(intervalTree[leftNodePosition], intervalTree[rightNodePosition]);
}