#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int Dim = 100001;
int Tree[Dim * 4],ma;
void Update(int node , int le , int ri ,int pos, int val );
void Query(int node, int le , int ri , int a ,int b);
int main() {
int n,x,m,task,y;
fin >> n >> m;
for ( int i = 1; i <= n; ++i) {
fin >> x;
Update(1,1,n,i,x);
}
for ( int i = 1; i <= m; ++i) {
fin >> task >> x >> y;
if ( task == 0) {
ma = 0;
Query(1,1,n,x, y);
fout << ma << "\n";
}
else Update(1,1,n,x,y);
}
}
void Update(int node , int le , int ri ,int pos, int val ){
if ( le == ri ) {
Tree[node] = val;
return;
}
int mj = ( le + ri ) / 2;
if ( pos <= mj)
Update(node * 2, le , mj , pos , val);
else Update(node * 2 + 1, mj + 1 , ri , pos , val);
Tree[node] = max(Tree[node * 2] , Tree[node * 2 + 1]);
}
void Query(int node, int le , int ri , int a ,int b) {
if ( a <= le and b >= ri ) {
ma = max ( Tree[node] , ma);
return;
}
int mj = ( le + ri) / 2;
if ( a <= mj)
Query(node * 2 , le , mj , a , b);
if ( b > mj )
Query(node * 2 + 1, mj + 1, ri , a , b);
}