/*
* =====================================================================================
*
* Filename: interval_tree_infoarena.cpp
*
* Description: http://www.infoarena.ro/problema/arbint
*
* Version: 1.0
* Created: 09/01/2015 04:53:45 PM
* Revision: none
* Compiler: gcc/g++
*
* Author: Marius-Constantin Melemciuc
* email:
* Organization:
*
* =====================================================================================
*/
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int n, m;
vector<int> interval_tree;
int max(int a, int b) {
return (a > b? a: b);
}
void update(int i, int left, int right, int position, int value) {
if (left == right) {
interval_tree[i] = value;
return;
}
int middle = left + ((right - left) >> 1);
if (position <= middle) {
update((i << 1), left, middle, position, value);
} else {
update((i << 1) + 1, middle + 1, right, position, value);
}
interval_tree[i] = max(interval_tree[(i << 1)],
interval_tree[(i << 1) + 1]);
}
void query(int i, int left, int right, int a, int b, int& max_value) {
if (a <= left && b >= right) {
if (interval_tree[i] > max_value) {
max_value = interval_tree[i];
}
return ;
}
int middle = left + ((right - left) >> 1);
if (a <= middle) {
query((i << 1), left, middle, a, b, max_value);
}
if (b > middle) {
query((i << 1) + 1, middle + 1, right, a, b, max_value);
}
}
int main() {
ifstream in("arbint.in");
ofstream out("arbint.out");
int operation;
int x, y;
in >> n >> m;
interval_tree.resize(n * 2 + 2, 0);
int value;
for (int i = 1; i <= n; i++) {
in >> value;
update(1, 1, n, i, value);
}
int max_value = -1;
for (int i = 0; i < m; i++) {
in >> operation >> x >> y;
if (operation == 0) {
max_value = -1;
query(1, 1, n, x, y, max_value);
out << max_value << "\n";
}
if (operation == 1) {
update(1, 1, n, x, y);
}
}
in.close();
out.close();
return 0;
}