#include<bits/stdc++.h>
#define MAXN 100002
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, v[MAXN], segtree[4 * MAXN];
void build(int node, int L, int R)
{
if(L == R)
{
segtree[node] = v[L];
return;
}
int mid = (L + R) / 2;
build(node * 2, L, mid);
build(node * 2 + 1, mid + 1, R);
segtree[node] = max(segtree[node * 2], segtree[node * 2 + 1]);
}
int query(int node, int L, int R, int st, int dr)
{
if(R < st || L > dr)
return 0;
if(st <= L && R <= dr)
return segtree[node];
int mid = (L + R) / 2;
int A = query(node * 2, L, mid, st, dr);
int B = query(node * 2 + 1, mid + 1, R, st, dr);
return max(A, B);
}
void update(int node, int L, int R, int pos, int val)
{
if(L == R)
{
segtree[node] = val;
return;
}
int mid = (L + R) / 2;
if(pos <= mid) // first half
update(node * 2, L, mid, pos, val);
else // second half
update(node * 2 + 1, mid + 1, R, pos, val);
segtree[node] = max(segtree[node * 2], segtree[node * 2 + 1]);
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; ++i)
f >> v[i];
build(1, 1, n);
for(int i = 1; i <= m; ++i)
{
int type, a, b;
f >> type >> a >> b;
if(type == 0)
g << query(1, 1, n, a, b) << '\n';
else
update(1, 1, n, a, b);
}
return 0;
}