//@romocoder
#include <cstdio>
#include <iostream>
using namespace std;
/***************************************************
AI de aflat maxim / min pe un interval
/**************************************************/
#define AIMAX 400040
typedef int AITYPE;
AITYPE treeAI[400040];
void updateAI(int nod, int a, int b, int at, AITYPE val) {
if (a > b) return;
if (a == b) {if (at == a) treeAI[nod] = val; return;}
int mij = (a + b) / 2;
updateAI(2*nod, a, mij, at, val);
updateAI(2*nod+1, mij+1, b, at, val);
treeAI[nod] = 0;
if (a <= mij) treeAI[nod] = treeAI[2*nod];
if (mij + 1 <= b && treeAI[nod*2 + 1] > treeAI[nod]) treeAI[nod] = treeAI[2*nod+1];
}
AITYPE getAI(int nod, int a, int b, int l, int r) {
if (a > b) return 0;
if (r < a || l > b) return 0;
if (a == b) return treeAI[nod];
if (l <= a && r >= b) return treeAI[nod];
int mij = a + b; mij /= 2;
AITYPE mx = getAI(2*nod, a, mij, l, r);
AITYPE mx2 = getAI(2*nod+1, mij+1, b, l, r);
if (mx > mx2) mx2 = mx;
return mx2;
}
/////////////////////////////////////////////////////////////////////
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int N, M;
cin >> N >> M;
int i, j, k;
for (i = 1; i <= N; ++i) {
int X;
cin >> X;
updateAI(1, 1, N, i, X);
}
while (M--) {
int A, B, C;
cin >> A >> B >> C;
if (A == 1) {updateAI(1, 1, N, B, C); continue;}
cout << getAI(1, 1, N, B, C) << '\n';
}
return 0;
}