# include <bits/stdc++.h>
using namespace std;
const int Nmax = 100000 + 5;
int N, M, x, op, a, b;
int arb[Nmax * 4], v[Nmax];
void update(int node, int left, int right, int poz, int val){
if (left == right) {
arb[node] = val;
return ;
}
int mij = (right + left) / 2;
if (poz <= mij) update (node * 2, left, mij, poz, val);
else update(node * 2 + 1, mij + 1, right, poz, val);
arb[node] = max (arb[node * 2], arb [node * 2 + 1]);
}
void build(int node, int left, int right) {
if (left == right) {
arb[node] = v[left];
return ;
}
int mij = (left + right) / 2;
build (node * 2, left, mij);
build (node * 2 + 1, mij + 1, right);
arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
}
int query(int node, int left, int right, int L, int R) {
if (left >= L && right <= R) return arb[node];
int Max = 0;
int mij = (right + left) / 2;
if (L <= mij) Max = max(Max, query(node * 2, left, mij, L, R));
if (R > mij) Max = max(Max, query(node * 2 + 1, mij + 1, right, L, R));
return Max;
}
int main ()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d\n", &N, &M);
for (int i = 1; i <= N; ++i)
{
scanf("%d ", &v[i]);
// update(1 , 1 , N, i, v[i]);
}
build (1, 1, N);
for (int i = 1; i <= M; ++i)
{
scanf("%d %d %d\n", &op, &a, &b);
if (!op) printf("%d\n", query(1, 1, N, a, b));
else update(1, 1, N, a, b);
}
return 0;
}