记录编号 515846 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [NEERC 2004] K小数 最终得分 100
用户昵称 Gravatar胡嘉兴 是否通过 通过
代码语言 C++ 运行时间 2.213 s
提交时间 2018-10-23 18:31:47 内存使用 37.70 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;
const int N = 1e5+7;
int tot, c;
vector<int> vec;
int v[N], rt[N], lc[N<<5], rc[N<<5], sum[N<<5];
void update(int & x, int & y, int l, int r, int v)
{
    y = ++tot;
    lc[y] = lc[x];
    rc[y] = rc[x];
    sum[y] = sum[x]+1;
    if(l<r)
    {
        int mid = (l+r)>>1;
        if(mid>=v)
        {
            update(lc[x], lc[y], l, mid, v);
        }
        else
        {
            update(rc[x], rc[y], mid+1, r, v);
        }
    }
    return;
}
int query(int x, int y, int l, int r, int k)
{
    if(l==r)
    {
        return l;
    }
    int mid = (l+r)>>1, cnt = sum[lc[y]]-sum[lc[x]];
    if(cnt>=k)
    {
        return query(lc[x], lc[y], l, mid, k);
    }
    return query(rc[x], rc[y], mid+1, r, k-cnt);
}
int main()
{
    int n, m, q;
    freopen("kthnumber.in","r",stdin);
	freopen("kthnumber.out","w",stdout);
    scanf("%d%d", &n, &q);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &v[i]);
        vec.push_back(v[i]);
    }
    sort(vec.begin(), vec.end());
    unique(vec.begin(), vec.end());
    m = vec.size();
    for(int i = 1; i <= n; i++)
    {
        update(rt[i-1], rt[i], 1, m, (int)(lower_bound(vec.begin(), vec.end(), v[i])-vec.begin()+1));
    }
    while(q--)
    {
        int l, r, k;
        scanf("%d%d%d", &l, &r, &k);
        printf("%d\n", vec[query(rt[l-1], rt[r], 1, m, k)-1]);
    }
    return 0;
}