#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
int valori[100010];
int arb_int[400010];
void buildtree(int node, int left, int right)
{
if (left == right)
arb_int[node] = valori[left];
else
{
int middle = (left + right) / 2;
buildtree(node * 2, left, middle);
buildtree(node * 2 + 1, middle + 1, right);
arb_int[node] = max(arb_int[node * 2], arb_int[node * 2 + 1]);
}
}
int getmax(int node, int tree_left, int tree_right, int interval_left, int interval_right)
{
if (tree_left > tree_right)
return -1;
if (tree_left > interval_right || tree_right < interval_left)
return -1;
if (tree_left >= interval_left && tree_right <= interval_right)
return arb_int[node];
int middle = (tree_left + tree_right) / 2;
return max(getmax(node * 2, tree_left, middle, interval_left, interval_right), getmax(node * 2 + 1, middle + 1, tree_right, interval_left, interval_right));
}
void update(int node, int position, int value, int tree_left, int tree_right)
{
if (tree_left == tree_right)
{
arb_int[node] = value;
return;
}
int middle = (tree_left + tree_right) / 2;
if (position <= middle)
update(node * 2, position, value, tree_left, middle);
else
update(node * 2 + 1, position, value, middle + 1, tree_right);
arb_int[node] = max(arb_int[node * 2], arb_int[node * 2 + 1]);
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
int nr_elemente, nr_operatii, tip_operatie;
f >> nr_elemente >> nr_operatii;
for (int i = 1; i <= nr_elemente; i++)
f >> valori[i];
buildtree(1, 1, nr_elemente);
int interval_left, interval_right, poz, val;
for (int i = 0; i < nr_operatii; i++)
{
f >> tip_operatie;
if (tip_operatie == 0)
{
f >> interval_left >> interval_right;
g << getmax(1, 1, nr_elemente, interval_left, interval_right) << "\n";
}
else
{
f >> poz >> val;
update(1, poz, val, 1, nr_elemente);
}
}
}