#include <bits/stdc++.h>
using namespace std;
#define NMAX 100005
int n, m, v[5 * NMAX], a, b, op, maxi;
void getMax(int node, int left, int right, int &maxi) {
if(a <= left && right <= b) {
maxi = max(maxi, v[node]);
} else {
int mid = (left + right) / 2;
if(a <= mid) {
getMax(2 * node, left, mid, maxi);
}
if(b > mid) {
getMax(2 * node + 1, mid + 1, right, maxi);
}
}
}
void update(int node, int left, int right) {
if(left == right) {
v[node] = b;
} else {
int mid = (left + right) / 2;
if(a <= mid) {
update(2 * node, left, mid);
} else {
update(2 * node + 1, mid + 1, right);
}
v[node] = max(v[2 * node], v[2 * node + 1]);
}
}
void search() {
getMax(1, 1, n, maxi = 0);
printf("%d\n", maxi);
}
void solve() {
if(op == 0) {
search();
} else {
update(1, 1, n);
}
}
void read() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &b);
a = i;
update(1, 1, n);
}
for(int i = 1; i <= m; i++) {
scanf("%d%d%d", &op, &a, &b);
solve();
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
read();
return 0;
}