比赛 20120718 评测结果 AAAAATTTTT
题目名称 找第k小的数 最终得分 50
用户昵称 Citron酱 运行时间 5.216 s
代码语言 C++ 内存使用 1.05 MiB
提交时间 2012-07-18 12:01:34
显示代码纯文本
#include <cstdlib>
#include <cstdio>

#define I_F "kth.in"
#define O_F "kth.out"

const long MAXn=100000;

long s[MAXn], t[MAXn];
long n,m;

void Input();
void Strcpy(const long&, const long&);
inline void Swap(long&, long&);
void Qsort(const long&, const long&);

int main()
{
	freopen(I_F,"r",stdin);
	Input();
	long l, r, k;
	freopen(O_F,"w",stdout);
	for (long i=0; i<m; ++i)
	{
		scanf("%ld%ld%ld",&l,&r,&k);
		Strcpy(l-1,r-1);
		Qsort(0,r-l);
		printf("%ld\n",t[k-1]);
	}
	return 0;
}

void Input()
{
	scanf("%ld%ld",&n,&m);
	for (long i=0; i<n; ++i)
		scanf("%ld",&s[i]);
}

void Strcpy(const long &l, const long &r)
{
	for (int i=0; i<=r-l; ++i)
		t[i]=s[l+i];
}

inline void Swap(long &a, long &b)
{
	long t=a;
	a=b;
	b=t;
}

void Qsort(const long &l, const long &r)
{
	if (r-l>20)
	{
		long x=t[l+rand()%(r-l+1)];
		long i=l, j=r;
		do
		{
			while (t[i]<x) ++i;
			while (t[j]>x) --j;
			if (i<=j)
				Swap(t[i++],t[j--]);
		} while (i<j);
		if (i<r) Qsort(i,r);
		if (l<j) Qsort(l,j);
	}
	else
	{
		bool flag=true;
		for (long i=l; i<r && flag; ++i)
		{
			flag=false;
			for (long j=r; j>i; --j)
				if (t[j]<t[j-1])
					Swap(t[j],t[j-1]),
					flag=true;
		}
	}
}