可持久化线段树2 RE 求调
  • 板块灌水区
  • 楼主SilverLi
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/6/28 20:44
  • 上次更新2023/11/3 12:12:42
查看原帖
可持久化线段树2 RE 求调
688783
SilverLi楼主2023/6/28 20:44

this

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
int n, Q;
int a[N];
int st, s[N];
int cnt, root[N];
struct tree { int l, r, sum; }t[N];
#define lu t[u].l
#define lv t[v].l
#define ru t[u].r
#define rv t[v].r
#define sumu t[u].sum
#define sumv t[v].sum
#define mid (l + r >> 1)
void build(int u, int l, int r) {
    if (l == r) return;
    lu = ++cnt;
    build(lu, 1, mid);
    ru = ++cnt;
    build(ru, mid + 1, r);
}
int insert(int u, int l, int r, int p) {
    int v = ++cnt;
    lv = lu, rv = ru, sumv = sumu + 1;
    if (l == r)
        return v;
    if (p <= mid)
        lv = insert(lu, 1, mid, p);
    else
        rv = insert(ru, mid + 1, r, p);
    return v;
}
int ans(int u, int v, int l, int r, int k) {
    if (l == r) return l;
    // left
    int d = t[lv].sum - t[lu].sum;
    if (d >= k)
        return ans(lu, lv, 1, mid, k);
    else
        return ans(ru, rv, mid + 1, r, k - d);
}
signed main() {
    cin >> n >> Q;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    copy(a + 1, a + n + 1, s + 1);
    sort(s + 1, s + n + 1);
    st = unique(s + 1, s + n + 1) - s - 1;
    root[0] = ++cnt;
    build(root[0], 1, st);
    for (int i = 1; i <= n; ++i) {
        int p = lower_bound(s + 1, s + st + 1, a[i]) - s;
        root[i] = insert(root[i - 1], 1, st, p);
    }
    while (Q--) {
        int l, r, k;
        cin >> l >> r >> k;
        cout << s[ans(root[l - 1], root[r], 1, st, k)] << '\n';
    }
    return 0;
}
2023/6/28 20:44
加载中...