【主席树】P3834 【模板】可持久化线段树 2
P3834 【模板】可持久化线段树 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <bits/stdc++.h> using namespace std; using i64 = long long; template<class Node> struct PersidentSegmentTree { #define lc(u) tr[u].l #define rc(u) tr[u].r #define sum(u) tr[u].s const int n; int tot = 0; vector<Node> tr; vector<int> root; PersidentSegmentTree(): n(0) {} PersidentSegmentTree(int n_): n(n_) { int N = (n << 7) + 10; tr.reserve(N); root.reserve(N); tr.resize(N); root.resize(N); function<void(int&, int, int)> build = [&](int& u, int l, int r) { u = ++ tot; sum(u) = 0; if (l == r) {javascript:void(0); return ; } int m = (l + r) >> 1; build(lc(u), l, m); build(rc(u), m + 1, r); }; build(root[0], 1, n); } void insert(int u, int& v, int l, int r, int pos) { v = ++ tot; tr[v] = tr[u], sum(v) = sum(u) + 1; if (l == r) return; int m = l + r >> 1; if (pos <= m) insert(lc(u), lc(v), l, m, pos); else insert(rc(u), rc(v), m + 1, r, pos); } int query(int u, int v, int l, int r, int k) { if (l == r) return l; int m = l + r >> 1, s = sum(lc(v)) - sum(lc(u)); if (k <= s) return query(lc(u), lc(v), l, m, k); else return query(rc(u), rc(v), m + 1, r, k - s); } }; struct Node { int l, r, s; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; vector<int> b(n + 1); for (int i = 1; i <= n; i ++) cin >> b[i]; auto a = b; sort(a.begin() + 1, a.end()); int m = unique(a.begin() + 1, a.end()) - a.begin() - 1; PersidentSegmentTree<Node> PST(m); for (int i = 1; i <= n; i ++) { int idx = lower_bound(a.begin() + 1, a.begin() + m + 1, b[i]) - a.begin(); PST.insert(PST.root[i - 1], PST.root[i], 1, m, idx); } while (q--) { int l, r, k; cin >> l >> r >> k; int idx = PST.query(PST.root[l - 1], PST.root[r], 1, m, k); cout << a[idx] << '\n'; } return 0; }
本文作者:Ke_scholar
本文链接:https://www.cnblogs.com/Kescholar/p/18347765
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-08-07 牛客周赛 Round 6
2023-08-07 AtCoder Beginner Contest 313