#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
vector<int> a, tree;
void build(int node ,int l, int r)
{
if(l == r)
{
tree[node] = a[l];
return ;
}
int mid = (l + r) / 2;
build(node * 2, l, mid);
build(node * 2 + 1, mid + 1, r);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
long long query(int node, int l, int r, int x, int y)
{
if(x <= l&& r <= y)
return tree[node];
if(y < l || x > r)
return 0;
return max(query(2 * node, l, (l + r ) / 2, x , y)
,
query(2 * node + 1, (l + r) / 2 + 1, r, x , y));
}
void update(int node, int l, int r, int val, int pos)
{
if (l == r) {
tree[node] = val;
return;
}
int mid = (l + r) / 2;
if(pos <= mid)
update(2 * node, l, mid, val ,pos);
else
update(2 * node + 1, mid + 1, r, val ,pos);
tree[node] = max(tree[node * 2],tree[node * 2 + 1]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
fin >> n;
fin >> m;
a.resize(n + 1);
tree.resize(4 * (n + 1) + 6);
for(int i =1; i <=n ; i++)
fin >> a[i];
build(1,1,n);
for(int i = 1; i <= m; i++)
{
int type;
fin >> type;
if(type)
{
int node, val;
fin >> node >> val;
update(1, 1, n, val, node);
}
else
{
int x, y;
fin >> x >> y;
fout << query(1, 1, n, x, y) << '\n';
}
}
return 0;
}