#include <stdio.h>
using namespace std;
#define MAXN 100000
int v[MAXN];
int aint[4 * MAXN];
int leftLim, rightLim;
void build(int left, int right, int loc) {
int leftSon, rightSon, mid;
if ( left == right ) {
aint[loc] = v[left];
return;
}
mid = (left + right) / 2;
leftSon = loc + 1;
rightSon = loc + 2 * (mid - left + 1);
build(left, mid, leftSon);
build(mid + 1, right, rightSon);
if ( aint[rightSon] > aint[leftSon] )
aint[loc] = aint[rightSon];
else
aint[loc] = aint[leftSon];
}
int calcAns(int left, int right, int loc) {
int leftMax, rightMax, leftSon, rightSon, mid;
if ( leftLim <= left && right <= rightLim ) {
return aint[loc];
}
mid = (left + right) / 2;
leftSon = loc + 1;
rightSon = loc + 2 * (mid - left + 1);
leftMax = rightMax = 0;
if ( leftLim <= mid ) {
leftMax = calcAns(left, mid, leftSon);
}
if ( rightLim > mid ) {
rightMax = calcAns(mid + 1, right, rightSon);
}
if ( leftMax > rightMax )
return leftMax;
return rightMax;
}
void update(int pos, int val, int loc, int left, int right) {
int leftSon, rightSon, mid;
if ( left == right ) {
aint[loc] = val;
return;
}
mid = (left + right) / 2;
leftSon = loc + 1;
rightSon = loc + 2 * (mid - left + 1);
if ( mid >= pos )
update(pos, val, leftSon, left, mid);
else
update(pos, val, rightSon, mid + 1, right);
if ( aint[rightSon] > aint[leftSon] )
aint[loc] = aint[rightSon];
else
aint[loc] = aint[leftSon];
}
int main() {
FILE *fin, *fout;
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
int n, m, q, a, b, i;
fscanf(fin, "%d%d", &n, &m);
for ( i = 0; i < n; i++ )
fscanf(fin, "%d", &v[i]);
build(0, n - 1, 0);
while ( m-- ) {
fscanf(fin, "%d%d%d", &q, &a, &b);
a--;
if ( q == 0 ) {
b--;
leftLim = a;
rightLim = b;
fprintf(fout, "%d\n", calcAns(0, n - 1, 0));
} else {
v[a] = b;
update(a, b, 0, 0, n - 1);
}
}
fclose(fin);
fclose(fout);
return 0;
}