比赛 |
ctime蒟蒻生日赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
K小数 |
最终得分 |
100 |
用户昵称 |
하루Kiev |
运行时间 |
2.609 s |
代码语言 |
C++ |
内存使用 |
230.35 MiB |
提交时间 |
2017-10-17 18:34:57 |
显示代码纯文本
# include "stdio.h"
# include "iostream"
# include "algorithm"
# define maxn 100005
using namespace std;
int n,m,tot,a[maxn],v[maxn],ai,bi,k;
int rt[maxn],cnt,ls[maxn*200],rs[maxn*200],sum[maxn*200];
void update(int &rt,int las,int pos,int l,int r){
rt=++cnt;
ls[rt]=ls[las];
rs[rt]=rs[las];
sum[rt]=sum[las]+1;
if(l==r) return;
int mid=(l+r)>>1;
if(pos<=mid) update(ls[rt],ls[las],pos,l,mid);
else update(rs[rt],rs[las],pos,mid+1,r);
}
int query(int x,int y,int l,int r,int k){
if(l==r) return l;
int mid=(l+r)>>1;
int rk=sum[ls[y]]-sum[ls[x]];
if(k<=rk) return query(ls[x],ls[y],l,mid,k);
else return query(rs[x],rs[y],mid+1,r,k-rk);
}
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]);v[i]=a[i];}
sort(a+1,a+1+n);
int tot=unique(a+1,a+1+n)-a-1;
for(int i=1;i<=n;i++){
v[i]=lower_bound(a+1,a+1+tot,v[i])-a;
update(rt[i],rt[i-1],v[i],1,tot);
}
while(m--){
scanf("%d%d%d",&ai,&bi,&k);
printf("%d\n",a[query(rt[ai-1],rt[bi],1,tot,k)]);
}
}