记录编号 454969 评测结果 AAAAAAAAAA
题目名称 [河南省队2012] 找第k小的数 最终得分 100
用户昵称 GravatarHzoi_QTY 是否通过 通过
代码语言 C++ 运行时间 1.525 s
提交时间 2017-09-30 17:51:31 内存使用 1.07 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100005
#define inf 1000000
using namespace std;
int n,m,a[N];
namespace chairtree
{
	struct tree
	{
		tree* lc;tree* rc;
		int sum;
		tree(){lc=rc=NULL;sum=0;}
	}*null=new tree(),*root[N];
	tree* newtree()
	{
		tree* o=new tree();
		o->lc=o->rc=null;
		o->sum=0;
		return o;
	}
	void build(int l,int r,tree* &x)
	{
		x=newtree();
		if(l==r){return;}
		int mid=l+r>>1;
		build(l,mid,x->lc);
		build(mid+1,r,x->rc);
	}
	void insert(int l,int r,tree* &x,tree* pre,int k)
	{
		x->sum=pre->sum+1;
		if(l==r){return;}
		int mid=l+r>>1;
		if(k<=mid)x->lc=newtree(),x->rc=pre->rc,insert(l,mid,x->lc,pre->lc,k);
		else x->rc=newtree(),x->lc=pre->lc,insert(mid+1,r,x->rc,pre->rc,k);
	}
	int q(int l,int r,tree* x1,tree* x2,int k)
	{
		int mid,cmp;
		while(l<r)
		{
			mid=l+r>>1;
			cmp=x2->lc->sum-x1->lc->sum;
			if(cmp>=k)
			{
				r=mid;x1=x1->lc;x2=x2->lc;
			}
			else
			{
				l=mid+1;k-=cmp;x1=x1->rc;x2=x2->rc;
			}
		}
		return r;
	}
}
using namespace chairtree;
int main()
{
	freopen("kth.in","r",stdin);
	freopen("kth.out","w",stdout);
	scanf("%d%d",&n,&m);null->lc=null->rc=null;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]),root[i]=newtree();
	root[0]=newtree();
	for(int i=1;i<=n;i++)insert(-inf,inf,root[i],root[i-1],a[i]);//cout<<root[1]->rc->sum<<endl;
	int l,r,k;
	while(m--)
	{
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",q(-inf,inf,root[l-1],root[r],k));
	}
}