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