RE 球条
查看原帖
RE 球条
1309434
t7424fd楼主2025/1/20 10:14

rt

#include <bits/stdc++.h>

using namespace std;

const int N = 200005;

int n, m, k, a[N], b[N];

struct Node
{
    int l, r, v;
    Node* lc, *rc;
} rt[N];

auto idx = [](int x) { return lower_bound(b, b + k, x) - b; };

void build(int l, int r, Node* t)
{
    t->l = l, t->r = r;
    if (l ^ r)
    {
        int mid = l + r >> 1;
        build(l, mid, t->lc = new Node), build(mid + 1, r, t->rc = new Node);
    }
}

void insert(Node* t, Node* p, int x)
{
    p->l = t->l, p->r = t->r, p->v = t->v + 1;
    if (t->l ^ t->r)
    {
        int mid = t->l + t->r >> 1;
        x > mid ? p->lc = t->lc, insert(t->rc, p->rc = new Node, x) : (p->rc = t->rc, insert(t->lc, p->lc = new Node, x));
    }
}

int query(Node* l, Node* r, int k)
{
    if (l->l == l->r) return l->l;
    int c = r->lc->v - l->lc->v;
    return k < c ? query(l->lc, r->lc, k) : query(l->rc, r->rc, k - c);
}

int main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr), cin >> n >> m, build(1, n, rt);
    for (int i = 0; i < n; cin >> a[i], b[i++] = a[i]);
    sort(b, b + n), k = unique(b, b + n) - b;
    for (int i = 0; i < n; insert(rt + i, rt + i + 1, idx(a[i++])));
    for (int l, r, x; m--; cin >> l >> r >> x, cout << b[query(rt + l - 1, rt + r, x - 1)] << '\n');
    return 0;
}
2025/1/20 10:14
加载中...