#include<bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, v[100002];
int segtree[400002]; // 4 * max N space
void build(int node, int Left, int Right)
{
if(Left == Right)
{
segtree[node] = v[Left];
return;
}
int mid = (Left + Right) / 2;
build(node * 2, Left, mid);
build(node * 2 + 1, mid + 1, Right);
segtree[node] = max(segtree[node * 2], segtree[node * 2 + 1]);
}
int query(int node, int Left, int Right, int a, int b)
{
if(Right < a || Left > b)
return 0;
if(a <= Left && Right <= b)
return segtree[node];
int mid = (Left + Right) / 2;
return max(query(node * 2, Left, mid, a, b), query(node * 2 + 1, mid + 1, Right, a, b));
}
void update(int node, int Left, int Right, int position, int value)
{
if(Left == Right)
{
segtree[node] = value;
return;
}
int mid = (Left + Right) / 2;
if(position <= mid)
update(node * 2, Left, mid, position, value);
else
update(node * 2 + 1, mid + 1, Right, position, value);
segtree[node] = max(segtree[node * 2], segtree[node * 2 + 1]);
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; ++i)
f >> v[i];
build(1, 1, n);
for(int i = 1; i <= m; ++i)
{
int type, a, b;
f >> type >> a >> b;
if(type == 0)
g << query(1, 1, n, a, b) << '\n';
else
update(1, 1, n, a, b);
}
return 0;
}