#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007, vec_len = 100002;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int vec[vec_len], tree[4 * vec_len];
void seg_build(int node, int l, int r)
{
if (l == r)
{
tree[node] = vec[l];
return;
}
int mid = (l + r) / 2;
seg_build(node * 2, l, mid);
seg_build(node * 2 + 1, mid + 1, r);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
void seg_update(int node, int l, int r, int pos, int val)
{
if (l == r)
{
tree[node] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
seg_update(node * 2, l, mid, pos, val);
else
seg_update(node * 2 + 1, mid + 1, r, pos, val);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
int maxx;
void seg_query(int node, int l, int r, int ql, int qr)
{
if (ql <= l && r <= qr)
{
maxx = max(maxx, tree[node]);
return;
}
int mid = (l + r) / 2;
if (ql <= mid)
seg_query(node * 2, l, mid, ql, qr);
if (qr >= mid + 1)
seg_query(node * 2 + 1, mid + 1, r, ql, qr);
}
int main()
{
cin.rdbuf(fin.rdbuf());
cout.rdbuf(fout.rdbuf());
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> vec[i];
seg_build(1, 1, n);
for (int i = 1; i <= m; i++)
{
int type;
cin >> type;
if (type == 0)
{
int ql, qr;
cin >> ql >> qr;
maxx = INT_MIN, seg_query(1, 1, n, ql, qr);
cout << maxx << "\n";
}
else
{
int pos, val;
cin >> pos >> val;
seg_update(1, 1, n, pos, val);
}
}
return 0;
}