QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: Lynn_Sue

Posted at: 2026-09-04 15:23:38

Last updated: 2026-09-04 15:29:03

Back to Problem

std::set,我爱你,像春夜的风缠着第一朵花,我甘愿沉沦在你怀里。

和前一个题是一样的,但是变成区间求最小值了怎么办?

set 放到线段树上。。。

每个线段树维护一个 set 即可。时间复杂度 $O(n \log^2 n)$,轻松拿下最劣解。

什么为什么是最劣解,因为根本不需要维护 set。。。

#include<bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
int n, q, a[100005];
set<pii> S[400005];
void upd(int u, int l, int r, int pos, int x, int typ){
    if (pos < l || pos > r) return;
    if (typ) S[u].insert({x, pos});
    else S[u].erase(S[u].find({x, pos}));
    if (l == r) return;
    upd(u << 1, l, (l + r) >> 1, pos, x, typ), upd(u << 1 | 1, (l + r + 2) >> 1, r, pos, x, typ);
}
pii qry(int u, int l, int r, int L, int R){
    if (l > R || r < L) return {2e9, 0};
    if (L <= l && r <= R) return *S[u].begin();
    return min(qry(u << 1, l, (l + r) >> 1, L, R), qry(u << 1 | 1, (l + r + 2) >> 1, r, L, R));
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i], upd(1, 1, n, i, a[i], 1);
    cin >> q; 
    while (q--){
        int op, x, y;
        cin >> op >> x >> y;
        if (op == 1) upd(1, 1, n, x, a[x], 0), upd(1, 1, n, x, a[x] = y, 1);
        else cout << qry(1, 1, n, x, y).second << "\n";
    }
    return 0;
}

Comments

No comments yet.