include [HTML_REMOVED]
using namespace std ;
const int N = 5e4 + 10 , inf = 1e8 + 33 ;
int n , m , a[N] ;
struct segt {
int l , r ;
multiset [HTML_REMOVED] s ;
}t[N << 2] ;
void buildnode (int u , int l , int r) {
t[u].l = l , t[u].r = r , t[u].s.insert (inf) , t[u].s.insert (-inf) ;
for (int i = l ; i <= r ; i ++) t[u].s.insert (a[i]) ;
if (l == r) return ;
int mid = l + r >> 1 ;
buildnode (u << 1 , l , mid) , buildnode (u << 1 | 1 , mid + 1 , r) ;
}
void modify (int u , int x , int val) {
t[u].s.erase (t[u].s.find (a[x])) , t[u].s.insert (val) ;
if (t[u].l == t[u].r) return ;
int mid = t[u].l + t[u].r >> 1 ;
if (x <= mid) modify (u << 1 , x , val) ;
else modify (u << 1 | 1 , x , val) ;
}
int query (int u , int ql , int qr , int x) {
if (t[u].l >= ql && t[u].r <= qr) {
return *–t[u].s.lower_bound (x) ;
}
int mid = t[u].l + t[u].r >> 1 ;
int res = 0 ;
if (ql <= mid) res = max (res , query (u << 1 , ql , qr , x)) ;
if (qr > mid) res = max (res , query (u << 1 | 1 , ql , qr , x)) ;
return res ;
}
int main () {
scanf (“%d%d” , &n , &m) ;
for (int i = 1 ; i <= n ; i ++) scanf (“%d” , &a[i]) ;
buildnode (1 , 1 , n) ;
while (m--) {
int opt ;
scanf ("%d" , &opt) ;
if (opt == 1) {
int pos , val ;
scanf ("%d%d" , &pos , &val) ;
modify (1 , pos , val) ;
a[pos] = val ;
}
else {
int ql , qr , x ;
scanf ("%d%d%d" , &ql , &qr , &x) ;
cout << query (1 , ql , qr , x) << endl ;
}
}
return 0 ;
}