// generated by GPT 5 pro // LLMの作問能力評価のために自動生成された回答 // by CPCTF 運営チーム #include using namespace std; struct Node { long long mx1, mx2; // top1, top2 Node(long long a = LLONG_MIN/4, long long b = LLONG_MIN/4) : mx1(a), mx2(b) {} }; struct SegTree { int n; // size of base array (N-1) vector st; SegTree() : n(0) {} SegTree(const vector& base) { build(base); } static Node mergeNode(const Node& L, const Node& R) { Node res; if (L.mx1 >= R.mx1) { res.mx1 = L.mx1; res.mx2 = max({L.mx2, R.mx1, R.mx2}); } else { res.mx1 = R.mx1; res.mx2 = max({R.mx2, L.mx1, L.mx2}); } return res; } void build(const vector& base) { n = (int)base.size(); if (n == 0) { st.clear(); return; } st.assign(4*n, Node()); build(1, 0, n-1, base); } void build(int p, int l, int r, const vector& base) { if (l == r) { st[p] = Node(base[l], LLONG_MIN/4); return; } int m = (l + r) >> 1; build(p<<1, l, m, base); build(p<<1|1, m+1, r, base); st[p] = mergeNode(st[p<<1], st[p<<1|1]); } void update(int idx, long long val) { if (n == 0) return; if (idx < 0 || idx >= n) return; update(1, 0, n-1, idx, val); } void update(int p, int l, int r, int idx, long long val) { if (l == r) { st[p] = Node(val, LLONG_MIN/4); return; } int m = (l + r) >> 1; if (idx <= m) update(p<<1, l, m, idx, val); else update(p<<1|1, m+1, r, idx, val); st[p] = mergeNode(st[p<<1], st[p<<1|1]); } Node query(int L, int R) { if (n == 0) return Node(); if (L > R) return Node(); L = max(L, 0); R = min(R, n-1); if (L > R) return Node(); return query(1, 0, n-1, L, R); } Node query(int p, int l, int r, int L, int R) { if (R < l || r < L) return Node(); if (L <= l && r <= R) return st[p]; int m = (l + r) >> 1; Node left = query(p<<1, l, m, L, R); Node right = query(p<<1|1, m+1, r, L, R); return mergeNode(left, right); } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; if (!(cin >> N >> Q)) return 0; vector A(N+1); for (int i = 1; i <= N; ++i) cin >> A[i]; // Build M[i] = min(A[i], A[i+1]) for i=1..N-1 -> 0-based index i-1 vector M; if (N >= 2) { M.resize(N-1); for (int i = 1; i <= N-1; ++i) M[i-1] = min(A[i], A[i+1]); } SegTree seg(M); auto second_largest_of4 = [](long long a, long long b, long long c, long long d) -> long long { long long b1 = LLONG_MIN/4, b2 = LLONG_MIN/4; long long arr[4] = {a, b, c, d}; for (int i = 0; i < 4; ++i) { long long x = arr[i]; if (x > b1) { b2 = b1; b1 = x; } else if (x > b2) { b2 = x; } } return b2; }; while (Q--) { int t; cin >> t; if (t == 1) { int i; long long x; cin >> i >> x; A[i] = x; if (N >= 2) { if (i > 1) { seg.update(i-2, min(A[i-1], A[i])); } if (i < N) { seg.update(i-1, min(A[i], A[i+1])); } } } else { int l, r; cin >> l >> r; Node res = seg.query(l-1, r-2); // M indices from l..r-1 -> 0-based [l-1, r-2] long long ans = second_largest_of4(A[l], A[r], res.mx1, res.mx2); cout << ans << '\n'; } } return 0; }