比赛 |
ctime蒟蒻生日赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
K小数 |
最终得分 |
100 |
用户昵称 |
Hzoi_Mafia |
运行时间 |
2.172 s |
代码语言 |
C++ |
内存使用 |
222.66 MiB |
提交时间 |
2017-10-17 20:05:11 |
显示代码纯文本
- #include<algorithm>
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- inline int read(){
- int sum(0),f(1);
- char ch(getchar());
- for(;ch<'0'||ch>'9';ch=getchar())
- if(ch=='-')
- f=-1;
- for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
- return sum*f;
- }
- int n,m;
- int v[100005],num[100005];
- int cnt,size;
- int rt[100005],lch[20000005],rch[20000005],sum[20000005];
- inline void update(int &x,int las,int pos,int l,int r){
- x=++cnt;
- lch[x]=lch[las];
- rch[x]=rch[las];
- sum[x]=sum[las]+1;
- if(l==r)
- return;
- int mid((l+r)>>1);
- if(pos<=mid)
- update(lch[x],lch[las],pos,l,mid);
- else
- update(rch[x],rch[las],pos,mid+1,r);
- }
- inline int query(int x,int y,int l,int r,int k){
- if(l==r)
- return l;
- int mid((l+r)>>1),cnt(sum[lch[y]]-sum[lch[x]]);
- if(k<=cnt)
- return query(lch[x],lch[y],l,mid,k);
- else
- return query(rch[x],rch[y],mid+1,r,k-cnt);
- }
- inline int gg(){
- freopen("kthnumber.in","r",stdin);
- freopen("kthnumber.out","w",stdout);
- n=read(),m=read();
- for(int i=1;i<=n;++i)
- num[i]=v[i]=read();
- sort(num+1,num+n+1);
- size=unique(num+1,num+n+1)-num-1;
- for(int i=1;i<=n;++i){
- v[i]=lower_bound(num+1,num+size+1,v[i])-num;
- update(rt[i],rt[i-1],v[i],1,size);
- }
- while(m--){
- int x(read()),y(read()),k(read());
- printf("%d\n",num[query(rt[x-1],rt[y],1,size,k)]);
- }
- return 0;
- }
- int K(gg());
- int main(){;}