记录编号 407974 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [NEERC 2004] K小数 最终得分 100
用户昵称 GravatarFisher. 是否通过 通过
代码语言 C++ 运行时间 3.157 s
提交时间 2017-05-23 16:17:49 内存使用 77.75 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <time.h>
#include <map>
#include <deque>
#include <string>
using namespace std;
int n,t;
int ppp[100010];
int data[100010];
int hash[100100];
int tot;
int ls[5000010];
int rs[5000010];
int sum[5000010];
int gen[5000010];
int dian;
inline bool cmp(int a,int b)
{
	return a>b;
}
inline int erfen(int x)
{
	int l=1;int r=tot;
	while(l+1<r)
	{
		int m=(l+r)/2;
		if(x<hash[m])l=m+1;
		else r=m;
	}
	if(hash[l]==x)return l;
	return r;
}
inline void gai(int shang,int &xin,int l,int r,int nl,int nr)
{
	xin=++dian;
	if(l>=nl&&r<=nr)
	{
		sum[xin]=sum[shang]+1;
		return ;
	}
	ls[xin]=ls[shang];
	rs[xin]=rs[shang];
	int m=(l+r)>>1;
	if(m>=nl)
	{
		gai(ls[shang],ls[xin],l,m,nl,nr);
	}
	if(m<nr)
	{
		gai(rs[shang],rs[xin],m+1,r,nl,nr);
	}
	sum[xin]=sum[ls[xin]]+sum[rs[xin]];
}
inline int find(int shang,int xin,int l,int r,int k)
{
	if(l==r)
	{
		return l;
	}
	//int zuo=sum[ls[shang]]-sum[ls[xin]];
	int you=sum[rs[xin]]-sum[rs[shang]];
	int m=(l+r)>>1;
	if(you>=k)
	{
		return find(rs[shang],rs[xin],m+1,r,k);
	}
	else
	{
		return find(ls[shang],ls[xin],l,m,k-you);
	}
}
int main()
{
	freopen("kthnumber.in","r",stdin);
	freopen("kthnumber.out","w",stdout);
	ios::sync_with_stdio(false);
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&ppp[i]);
		data[i]=ppp[i];
	}
	sort(ppp+1,ppp+1+n,cmp);
	for(int i=1;i<=n;i++)
	{
		if(ppp[i]!=ppp[i-1])
		{
			hash[++tot]=ppp[i];
		}
	}
	for(int i=1;i<=n;i++)
	{
		int u=erfen(data[i]);
		gai(gen[i-1],gen[i],1,tot,u,u);
	}
	while(t--)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		printf("%d\n",hash[find(gen[x-1],gen[y],1,tot,z)]);
		//cout<<x<<y<<z<<" "<<find(gen[x-1],gen[y],1,tot,z)<<endl;
	}
	return 0;
}