ブルーブリッジカップ--アルゴリズム訓練区間k大数クエリー


質問は、与えられたシーケンスを記述し、シーケンスのl番目の数からr番目の数のK番目の数がどれであるかを尋ねるたびに.
入力フォーマットの最初の行には、シーケンスの長さを表す数nが含まれます.
2行目は、与えられたシーケンスを表すn個の正の整数を含む.
3番目は、質問個数を表す正の整数mを含む.
次にm行、各行3個の数l,r,Kは、質問シーケンスが左から右へl番目の数からr番目の数まで、大きいから小さいK番目の数がどれであるかを示す.シーケンス要素は1から始まる.
出力フォーマットは合計m行を出力し、各行に1つの数で、質問の答えを表す.
サンプル入力5 1 2 3 4 5 2 1 5 2 3 2サンプル出力4 2データ規模と30%のデータに対して、n,m<=100;
100%のデータに対して、n,m<=1000;
k<=(r−l+1)、シーケンス中の数<=10^6を保証する.
#include
#include
using namespace std;
int N;
typedef struct {
	int i, j, k;	// i~j      k 
}ask;

void quick(int *num, int left, int right)
{
	if (left < right)
	{
		int i = left, j = right;
		num[0] = num[left];
		do
		{
			while (num[j] < num[0] && i < j)
				j--;
			if (i < j)
			{
				num[i] = num[j];
				i++;
			}
			while (num[i] > num[0] && i < j)
				i++;
			if (i < j)
			{
				num[j] = num[i];
				j--;
			}
		} while (i != j);
		num[i] = num[0];
		quick(num, left, i - 1);
		quick(num, i + 1, right);
	}
}

int fond(int *num, int beg, int len)
{
	return num[beg + len-1];
}

void copy(int *num, int *test)
{
	for (int i = 1; i <= N; i++)
		test[i] = num[i];
}

int main()
{
	ask ques[1001];
	int num[1001],Q,test[1001];
	cin >> N;
	int i;
	for (i = 1; i <= N; i++)
	{
		cin >> num[i];				//    
	}							
	cin >> Q;
	for (i = 1; i <= Q; i++)
	{
		cin >> ques[i].i >> ques[i].j >> ques[i].k;
	}
	i = 1;
	while (i <= Q)
	{
		copy(num, test);				//     
		quick(test, ques[i].i, ques[i].j);	//i~j  ( - )
		cout << fond(test, ques[i].i, ques[i].k) << endl;	//      k  
		i++;
	}
	system("pause");
	return 0;
}