#include <bits/stdc++.h>
 
using namespace std;
 
const int inf  = 1e9 + 7;
const int maxN = 1e5 + 7;
 
int n, m;
int a[maxN];
int leaf[4 * maxN]; // Lưu chỉ số của nút lá tương ứng với phần tử ở vị trí i trong dãy số
multiset <int> st[4 * maxN];
 
void build(int id, int l, int r) {
    if (l == r) {
        leaf[l] = id;
        st[id].insert(a[l]);
        return;
    }
    int mid = l + r >> 1;
    build(2 * id, l, mid);
    build(2 * id + 1, mid + 1, r);
    
    st[id] = st[2 * id + 1];
    for (auto x : st[2 * id]) st[id].insert(x);
}

void update(int i, int val){
    int id  = leaf[i]; 
    int old = *st[id].begin();
    while (id) {
        st[id].erase(st[id].find(old));
        st[id].insert(val);
        id /= 2;
    }
}
 
int get(int id, int l, int r, int u, int v, int k) {
    if (l >  v || r <  u) return inf; 
    if (l >= u && r <= v) {
        auto it = st[id].lower_bound(k);
        if (it == st[id].end()) return inf;
        return *it;
    }

    int mid = l + r >> 1;
    int get1 = get(2 * id, l, mid, u, v, k);
    int get2 = get(2 * id + 1, mid + 1, r, u, v, k);
    return min(get1, get2);
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) cin >> a[i];
    build(1, 1, n);

    while (m--){
        int type, l, r, k;
        cin >> type;
        if (type == 1) {
            cin >> l >> k;
            update(l, k);
        }
        else {
            cin >> l >> r >> k;
            int ans = get(1, 1, n, l, r, k);
            cout << ((ans == inf) ? -1 : ans) << '\n';
        }
    }
}
