#include <cstdio>
#define NMax 100001
using namespace std;
long a, b, n, m, v[NMax];
bool bl;
class treeNod {
public:
treeNod *leftChild, *rightChild;
long val, ia, ib;
treeNod ( ) {
leftChild = rightChild = NULL;
val = ia = ib = 0;
}
long max ( long a, long b ) {
return a > b ? a : b;
}
long createNod ( long v[], long left, long right ) {
ia = left; ib = right;
if ( left == right ) {
val = v[left];
return v[left];
}
else {
leftChild = new treeNod;
rightChild = new treeNod;
long middle = left + ( right - left ) / 2;
val = max ( leftChild->createNod ( v, left, middle ), rightChild->createNod ( v, middle + 1, right ) );
return val;
}
}
long maxInter ( long left, long right ) {
long middle = ia + ( ib - ia ) / 2;
if ( left == ia && right == ib )
return val;
else if ( left <= middle && middle < right) {
long x1 = leftChild->maxInter ( left, middle );
long x2 = rightChild->maxInter ( middle + 1, right );
return max ( x1, x2 );
}
else if ( left <= middle && right <= middle )
return leftChild->maxInter ( left, right );
else
return rightChild->maxInter ( left, right );
}
long changeVal ( long poz, long value ) {
if ( ia == ib && ia == poz )
val = value;
else {
long middle = ia + ( ib - ia ) / 2;
if ( poz <= middle )
val = max ( leftChild->changeVal ( poz, value ), rightChild->val );
else
val = max ( leftChild->val, rightChild->changeVal ( poz, value ) );
}
return val;
}
};
class Tree {
public:
treeNod *t;
long maxVal;
Tree ( ) {
t = NULL;
maxVal = 0;
}
void createTree ( long v[], long n ) {
t = new treeNod;
if ( n > 0 ) maxVal = t->createNod ( v, 1, n );
}
void changeVal ( long poz, long value ) {
maxVal = t->changeVal ( poz, value );
}
long maxInter ( long left, long right ) {
return t->maxInter ( left, right );
}
} tr;
int main()
{
freopen ( "arbint.in", "r", stdin );
freopen ( "arbint.out", "w", stdout );
scanf ( "%ld %ld", &n, &m );
for ( long i = 1; i <= n; i++ )
scanf ( "%ld", &v[i] );
tr.createTree ( v, n );
for ( long i = 1; i <= m; i++ ) {
scanf ( "%ld %ld %ld", &bl, &a, &b );
if ( bl == 0 )
printf ( "%ld\n", tr.maxInter ( a, b ) );
else
tr.changeVal ( a, b );
}
return 0;
}