| 记录编号 |
432668 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
930.[河南省队2012] 找第k小的数 |
最终得分 |
100 |
| 用户昵称 |
xyz117 |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.599 s |
| 提交时间 |
2017-08-03 17:22:23 |
内存使用 |
24.56 MiB |
显示代码纯文本
#pragma GCC optimize("O3")
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxn 100001
namespace FIFO
{
char ch,B[1<<20],*S=B,*T=B;
#define getc() (S==T&&(T=(S=B)+fread(B,1,1<<20,stdin),S==T)?0:*S++)
#define isd(c) (c>='0'&&c<='9')
int aa,bb;int F(){
while(ch=getc(),!isd(ch)&&ch!='-');ch=='-'?aa=bb=0:(aa=ch-'0',bb=1);
while(ch=getc(),isd(ch))aa=aa*10+ch-'0';return bb?aa:-aa;
}
}
#define gi FIFO::F()
inline int read()
{
char s=getchar();
int a=0;
while(s<'0'||s>'9')
s=getchar();
while(s>='0'&&s<='9')
{
a=(a<<1)+(a<<3)+s-'0';
s=getchar();
}
return a;
}
struct tree
{
int lc,rc,sum;
}tree[maxn*19];
int n,m,t;
void build(int &num,int &x,int l,int r)
{
tree[t++]=tree[x];
x=t-1;
++tree[x].sum;
if(l==r)
return ;
int mid=l+r>>1;
if(num<=mid)
build(num,tree[x].lc,l,mid);
else
build(num,tree[x].rc,mid+1,r);
}
int query(int i,int j,int k,int l,int r)
{
if(l==r)
return l;
int cnt=tree[tree[j].lc].sum-tree[tree[i].lc].sum;
int mid=l+r>>1;
if(k<=cnt)
return query(tree[i].lc,tree[j].lc,k,l,mid);
return query(tree[i].rc,tree[j].rc,k-cnt,mid+1,r);
}
struct AAA
{
int x,id;
bool operator < (const AAA &BBB) const
{
return x<BBB.x;
}
}a[maxn];
int root[maxn],order[maxn];
int main()
{
freopen("kth.in","r",stdin);
freopen("kth.out","w",stdout);
int x,y,z,i;
tree[0].lc=tree[0].rc=tree[0].sum=0;
root[0]=0;
n=gi;
m=gi;
for(i=1;i<=n;++i)
{
a[i].x=gi;
a[i].id=i;
}
sort(a+1,a+n+1);
for(i=1;i<=n;++i)
order[a[i].id]=i;
t=1;
for(i=1;i<=n;++i)
{
root[i]=root[i-1];
build(order[i],root[i],1,n);
}
for(i=1;i<=m;++i)
{
x=gi;
y=gi;
z=gi;
printf("%d\n",a[query(root[x-1],root[y],z,1,n)].x);
}
}