#include <stdio.h>
#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < n; i++)
#define repa(i, l, r) for (int i = l; i < r; i++)
#define repd(i, r, l) for (int i = r; i > l; i--)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int Nmax = 100555;
int N, M, Arb[3*Nmax];
void update(int nod, int l, int r, int pos, int val);
int query(int nod, int l, int r, int a, int b);
int main(void) {
int x,q,a,b;
fin >> N >> M;
rep(i, N) {
fin >> x;
update(1, 1, N, i+1, x);
}
rep(i, M) {
fin >> q >> a >> b;
if (q == 0) {
fout << query(1, 1, N, a, b) << '\n';
} else if (q == 1) {
update(1, 1, N, a, b);
}
}
return 0;
}
void update(int nod, int l, int r, int pos, int val) {
if (l == r) {
Arb[nod] = val;
return;
}
int mid = l + (r - l)/2;
if (pos <= mid) {
update(2*nod, l, mid, pos, val);
} else {
update(2*nod+1, mid+1, r, pos, val);
}
Arb[nod] = max(Arb[2*nod], Arb[2*nod+1]);
}
int query(int nod, int l, int r, int a, int b) {
if (a <= l && r <= b) {
return Arb[nod];
}
int mid = l + (r - l)/2;
if (b < mid+1) {
return query(2*nod, l, mid, a, b);
} else if (a > mid) {
return query(2*nod+1, mid+1, r, a, b);
} else {
return max(
query(2*nod, l, mid, a, b),
query(2*nod+1, mid+1, r, a, b)
);
}
}