记录编号 600088 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [NEERC 2004] K小数 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 3.222 s
提交时间 2025-04-15 20:05:55 内存使用 35.44 MiB
显示代码纯文本
#include <cstdio>

const int MAXV = 1e9;
const int MAXN = 2e5 + 10;

struct NODE {
    int ls, rs;
    int sum;
} node[MAXN * 40];

int nodeNum;
void Insert(int rootBefore, int &root, int lt, int rt, int val) {
    root = ++nodeNum;
    node[root] = node[rootBefore];
    if (lt == rt) {
        node[root].sum += 1;
        return ;
    }
    int mid = lt + ((rt - lt) >> 1);
    if (val <= mid) {
        Insert(node[rootBefore].ls, node[root].ls, lt, mid, val);
    } else {
        Insert(node[rootBefore].rs, node[root].rs, mid + 1, rt, val);
    }
    node[root].sum = node[node[root].ls].sum + node[node[root].rs].sum;
}

int GetK(int rootBefore, int root, int lt, int rt, int k) {
    if (lt == rt) {
        return lt;
    }
    int mid = lt + ((rt - lt) >> 1);
    int x = node[node[root].ls].sum - node[node[rootBefore].ls].sum;
    if (x >= k) {
        return GetK(node[rootBefore].ls, node[root].ls, lt, mid, k);
    } else {
        return GetK(node[rootBefore].rs, node[root].rs, mid + 1, rt, k - x);
    }
}

int n, m;
int a[MAXN];
int root[MAXN];

int main() {
	freopen("kthnumber.in", "r", stdin);
	freopen("kthnumber.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        Insert(root[i - 1], root[i], -MAXV, MAXV, a[i]);
    }
    for (int i = 1; i <= m; ++i) {
        int l, r, k;
        scanf("%d %d %d", &l, &r, &k);
        printf("%d\n", GetK(root[l - 1], root[r], -MAXV, MAXV, k));
    }
    return 0;
}