#include <bits/stdc++.h>
#define N_MAX 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N, M;
int tree[4 * N_MAX];
void update(int node, int le, int ri, int pos, int val)
{
if(le == ri) {
tree[node] = val;
return;
}
int mid = (le + ri) / 2;
if(pos <= mid) {
update(2 * node, le, mid, pos, val);
}
else {
update(2 * node + 1, mid + 1, ri, pos, val);
}
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void query(int node, int le, int ri, int a, int b, int &MI)
{
if(a <= le && ri <= b) {
MI = max(MI, tree[node]);
return;
}
int mid = (le + ri) / 2;
if(a <= mid) {
query(2 * node, le, mid, a, b, MI);
}
if(b > mid) {
query(2 * node + 1, mid + 1, ri, a, b, MI);
}
}
int main()
{
f >> N >> M;
for(int i = 1; i <= N; i++) {
int x;
f >> x;
update(1, 1, N, i, x);
}
while(M--) {
int t, x, y;
f >> t >> x >> y;
if(t == 1) {
update(1, 1, N, x, y);
}
else {
int ans = -1;
query(1, 1, N, x, y, ans);
g << ans << "\n";
}
}
return 0;
}