记录编号 |
515846 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NEERC 2004] K小数 |
最终得分 |
100 |
用户昵称 |
胡嘉兴 |
是否通过 |
通过 |
代码语言 |
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;
}