#include <bits/stdc++.h>
using namespace std;
int n, m, v[100010], op, a, b, tree[400010];
void build(int node, int st, int dr)
{
if(st == dr)
{
tree[node] = v[st];
return ;
}
int mij = (st + dr) / 2;
build(2 * node, st, mij);
build(2 * node + 1, mij + 1, dr);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void update(int node, int st, int dr, int pos, int val)
{
if(st == dr)
{
tree[node] = val;
return;
}
int mij = (st + dr) / 2;
if(pos <= mij)
update(2 * node, st, mij, pos, val);
else
update(2 * node + 1, mij + 1, dr, pos, val);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
int query(int node, int st, int dr, int s, int d)
{
if(s <= st && dr <= d)
return tree[node];
int mij = (st + dr) / 2, ans1 = 0, ans2 = 0;
if(s <= mij)
ans1 = query(2 * node, st, mij, s, d);
if(d > mij)
ans2 = query(2 * node + 1, mij + 1, dr, s, d);
return max(ans1, ans2);
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> n >> m;
for(int i = 1; i <= n; i++)
f >> v[i];
build(1, 1, n);
for(int i = 1; i <= m; i++)
{
f >> op >> a >> b;
if(op == 0)
g << query(1, 1, n, a, b) << "\n";
else
update(1, 1, n, a, b);
}
return 0;
}