#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#define LEN 100005
using namespace std;
typedef long long LL;
LL A[2*LEN];
int c = 1;
void insert(int pos, LL n)
{
int i = pos + c - 1;
A[i] = n;
i /= 2;
while(i) {
A[i] = (A[2*i] > A[2*i+1]) ? A[2*i] : A[2*i + 1];
i /= 2;
}
}
LL maximum(int nod, int s, int f, int a, int b)
{
if(a <= s && f <= b) return A[nod];
int mid = (s + f) / 2;
LL l = 0, r = 0;
if (a <= mid) l = maximum(2*nod, s, mid, a, b);
if (b > mid) r = maximum(2*nod + 1, mid + 1, f, a, b);
return (l > r) ? l : r;
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int N, M;
scanf("%d %d\n", &N, &M);
while(c < N) {c *= 2;}
for(int i = 0; i < 2*c; i++) A[i] = 0;
for(int i = c; i < N + c; i++)
scanf("%lld", &A[i]);
for(int i = c - 1; i; i--) {
A[i] = (A[2*i] > A[2*i+1] ) ? A[2*i] : A[2*i+1];
}
/*
cout << maximum(1, 1, 8, 1, 3) << endl;
for(int i = 0; i < 2*c; i++)
cout << A[i] << ' ';
cout << endl;
insert(3, 2);
for(int i = 0; i < 2*c; i++)
cout << A[i] << ' ';
cout << endl;
*/
int t,x,y;
LL n;
for(int i = 0; i < M; i++) {
scanf("%d ", &t);
if (t == 0) {
scanf("%d %d\n", &x, &y);
n = maximum(1, 1, c, x, y);
printf("%lld\n", n);}
else {scanf("%d %lld", &x, &n);
insert(x, n);}
}
return 0;
}