#include <bits/stdc++.h>
#define MAX 100000
#define int long long
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n, m, v[MAX + 5], typ, a, b;
int tree[MAX * 4 + 5];
void update(int st, int dr, int node, int pos, int val)
{
if(st == dr)
{
tree[node] = val;
return;
}
int mid = (st + dr) >> 1;
if(pos <= mid)
update(st, mid, (node << 1) + 1, pos, val);
else
update(mid + 1, dr, (node << 1) + 2, pos, val);
tree[node] = max(tree[(node<<1)+1], tree[(node<<1)+2]);
}
int query(int st, int dr, int node, int x, int y)
{
if(st >= x && y >= dr)
return tree[node];
int mid = (st + dr) >> 1, val = 0;
if(x <= mid)
val = max(val, query(st, mid, (node << 1) + 1, x, y));
if(mid < y)
val = max(val, query(mid + 1, dr, (node << 1) + 2, x, y));
return val;
}
signed main()
{
fin >> n >> m;
for(int i = 1; i <= n; ++i)
{
fin >> v[i];
update(1, n, 0, i, v[i]);
}
for(int i = 1; i <= m; ++i)
{
fin >> typ >> a >> b;
if(typ)
update(1, n, 0, a, b);
else
fout << query(1, n, 0, a, b) << '\n';
}
}