#include <fstream>
#include <iostream>
#define NMAX 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, Q, op, a, b;
int tree[4*NMAX];
int v[NMAX];
int maxi( int x, int y ){
if( x > y ) return x;
return y;
}
void Update( int nod, int lf, int rg, int val, int pos ){
//cout << lf << ' ' << rg << ' ' << lf + ( rg - lf )/2 << '\n';
if( lf == rg ){
tree[nod] = val;
return;
}
int mid = lf + ( rg - lf )/2;
if( pos <= mid ) Update( nod*2, lf, mid, val, pos );
else Update( nod*2+1, mid+1, rg, val, pos);
tree[nod] = maxi( tree[nod*2], tree[nod*2+1] );
}
int Query( int nod, int lf, int rg, int L, int R ){
if( L <= lf && rg <= R ) return tree[nod];
int mid = lf + ( rg - lf )/2;
int ans1, ans2;
ans1 = ans2 = 0;
if( L <= mid ) ans1 = Query( nod*2, lf, mid, L, R );
if( mid < R ) ans2 = Query( nod*2+1, mid+1, rg, L, R);
return maxi(ans1, ans2);
}
void AINT(){
fin >> N >> Q;
for( int i = 1; i <= N; ++i ){
fin >> v[i];
Update( 1, 1, N, v[i], i);
//cout << Query( 1, 1, N, i, i) << ' ' << Query( 1, 1, N, 1, N) << '\n';
}
for( int q = 1; q <= Q; ++q ){
fin >> op >> a >> b;
if( op == 0 ){
fout << Query( 1, 1, N, a, b ) << '\n';
}
else{
Update( 1, 1, N, b, a);
}
}
}
int main()
{
AINT();
return 0;
}