// FMI - Grupa 135 - Semigrupa 2 - Hareza Andrei
// Include
#include <fstream>
using namespace std;
// Clase
template<class T, int SIZE> class segment_tree
{
#define leftSon (node<<1)
#define rightSon ((node<<1)+1)
private:
T tree[SIZE<<2];
int maxSize, currentSize;
public:
segment_tree()
{
#include <cstring>
memset(tree, 0, sizeof(tree));
maxSize = 0;
currentSize = 0;
}
segment_tree(int maxSize)
{
memset(tree, 0, sizeof(tree));
this->maxSize = maxSize;
currentSize = 0;
}
void setSize(int maxSize)
{
this->maxSize = maxSize;
}
void insert(int value)
{
this->update(++currentSize, value);
}
void update(int pos, int value)
{
this->realUpdate(1, 1, maxSize, pos, value);
}
private:
void realUpdate(int node, int left, int right, int pos, int value)
{
if(left == right)
{
tree[node] = value;
return;
}
int mid = (left+right)>>1;
if(pos <= mid)
realUpdate(leftSon, left, mid, pos, value);
else
realUpdate(rightSon, mid+1, right, pos, value);
tree[node] = max(tree[leftSon], tree[rightSon]);
}
public:
int query(int qLeft, int qRight)
{
return realQuery(1, 1, maxSize, qLeft, qRight);
}
private:
int realQuery(int node, int left, int right, int qLeft, int qRight)
{
if(qLeft <= left && right <= qRight)
return tree[node];
if(right < qLeft || qRight < left)
return 0;
int mid = (left+right)>>1;
#define rql realQuery(leftSon, left, mid, qLeft, qRight)
#define rqr realQuery(rightSon, mid+1, right, qLeft, qRight)
return max(rql, rqr);
#undef rql
#undef rqr
}
#undef leftSon
#undef rightSon
};
// Constante
const int sz = 100001;
// Variabile
ifstream in("arbint.in");
ofstream out("arbint.out");
int num, questions;
// Main
int main()
{
in >> num >> questions;
segment_tree<int, sz> tree(num);
int val;
for(int i=1 ; i<=num ; ++i)
{
in >> val;
tree.insert(val);
}
int type, a, b;
while(questions--)
{
in >> type >> a >> b;
if(type)
tree.update(a, b);
else
out << tree.query(a, b) << '\n';
}
in.close();
out.close();
return 0;
}