#include <fstream>
#include <iostream>
#define Nmax 100001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int sgm_tree[Nmax << 2], N, M, v[Nmax];
int maxim(int a, int b)
{
return (a > b) ? a : b;
}
void recalculate(int node)
{
sgm_tree[node] = maxim(sgm_tree[node << 1], sgm_tree[(node << 1) + 1]);
}
void build_sgm_tree(int node, int left, int right)
{
if(left != right)
{
int mid = (left + right) >> 1;
build_sgm_tree(node << 1, left, mid);
build_sgm_tree((node << 1) + 1, mid + 1, right);
recalculate(node);
}
else
{
sgm_tree[node] = v[left];
}
}
void update(int node, int left, int right, int x, int y)
{
if(left == right)
{
sgm_tree[node] = y;
}
else
{
int mid = (left + right) >> 1;
if(x <= mid)
update(node << 1, left, mid, x, y);
else
update((node << 1) + 1, mid + 1, right, x, y);
recalculate(node);
}
}
int query(int node, int left, int right, int x, int y)
{
if(x <= left && right <= y)
return sgm_tree[node];
else
{
int answer = -1;
int mid = (left + right) >> 1;
if(x <= mid)
answer = maxim(answer, query(node << 1, left, mid, x, y));
if(y >= mid + 1)
answer = maxim(answer, query((node << 1) + 1, mid + 1, right, x, y));
return answer;
}
}
int main()
{
int i, ok, a, b;
f >> N >> M;
for(i = 1; i < N + 1; i++)
f >> v[i];
build_sgm_tree(1, 1, N);
for(i = 1; i < 30; i++)
if(sgm_tree[i] != 0)
cout << i << " " << smg_tree[i] << "\n";
for(i = 0; i < M; i++)
{
f >> ok >> a >> b;
if(ok)
update(1, 1, N, a, b);
else
g << query(1, 1, N, a, b) << "\n";
}
return 0;
}