#include <bits/stdc++.h>
using namespace std;
const int NMAX = 100005;
int n, m, arb[NMAX];
inline void update(int node, int st, int dr, int ind, int val)
{
if (st == dr)
{
arb[node] = val;
return ;
}
int mij = (st + dr) >> 1;
if (ind <= mij)
update(2 * node, st, mij, ind, val);
else update(2 * node + 1, mij + 1, dr, ind, val);
arb[node] = max(arb[2 * node] , arb[2 * node + 1]);
return ;
}
inline int query(int node, int st, int dr, int cap1, int cap2)
{
int v1 = 0, v2 = 0;
if (st >= cap1 && dr <= cap2)
return arb[node];
int mij = (st + dr) >> 1;
if (cap1 <= mij)
v1 = query(node * 2, st, mij, cap1, cap2);
if (cap2 > mij)
v2 = query(node * 2 + 1, mij + 1, dr, cap1, cap2);
return max(v1, v2);
}
int main()
{
freopen("aint.in", "r", stdin);
freopen("aint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i<=n; ++i)
{
int x;
scanf("%d", &x);
update(1 , 1 , n, i, x);
}
for (int i = 1; i<=m; ++i)
{
int instr , x , y;
scanf("%d %d %d", &instr, &x, &y);
if (instr == 0)
printf("%d\n", query(1, 1 , n, x, y));
else
update(1, 1, n, x, y);
}
return 0;
}