#include <bits/stdc++.h>
using namespace std;
class MaximumSegmentTree
{
int tree_size = 0;
vector<long long> tree;
public:
explicit MaximumSegmentTree(int n)
{
this->tree.resize(4 * n + 20, 0);
tree_size = n;
}
void update(int position, int value)
{
update_helper(1, 1, tree_size, position, value);
}
long long query(int position)
{
return query_helper(1, 1, tree_size, position, position);
}
long long query(int left, int right)
{
return query_helper(1, 1, tree_size, left, right);
}
private:
void update_helper(int node, int left, int right, int position, int value)
{
if(left == right)
{
tree[node] = value;
}
else
{
int middle = (left + right) / 2;
if(position <= middle)
{
update_helper(node * 2, left, middle, position, value);
}
else
{
update_helper(node * 2 + 1, middle + 1, right, position, value);
}
tree[node] = max(tree[node * 2],tree[node * 2 + 1]);
}
}
long long query_helper(int node, int left, int right, int query_left, int query_right)
{
if(query_left <= left && query_right >= right)
{
return tree[node];
}
else
{
int middle = (left + right) / 2;
long long left_min = 0, right_min = 0;
if(query_left <= middle)
{
left_min = query_helper(node * 2, left, middle, query_left, query_right);
}
if(middle + 1 <= query_right)
{
right_min = query_helper(node * 2 + 1, middle + 1, right, query_left, query_right);
}
return max(left_min, right_min);
}
}
};
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
cin.tie(nullptr)->sync_with_stdio(false);
int n, q;
cin >> n >> q;
MaximumSegmentTree tree(n);
for(int i = 1; i <= n; i++)
{
int x;
cin >> x;
tree.update(i, x);
}
for(int i = 1; i <= q; i++)
{
int t, x, y;
cin >> t >> x >> y;
if(t == 1)
{
tree.update(x, y);
}
if(t == 0)
{
cout << tree.query(x, y) << "\n";
}
}
}