区间k大数查询

问题描述

给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。

输入格式

第一行包含一个数n,表示序列长度。

第二行包含n个正整数,表示给定的序列。

第三个包含一个正整数m,表示询问个数。

接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。

输出格式
总共输出m行,每行一个数,表示询问的答案。
样例输入
5
1 2 3 4 5
2
1 5 2
2 3 2
样例输出
4
2
 
代码:
 1 #include <iostream>
 2 using namespace std;
 3 int a[1002];
 4 int old[1002];
 5 void Sort(int left,int right)
 6 {
 7     int i,j,t;
 8     if(left > right)
 9     {
10         return;
11     }
12     
13     t = a[left];
14     i = left;
15     j = right;
16     
17     while(i != j)
18     {
19         while(a[j]>=t && i<j)
20             j--;
21         while(a[i]<=t && i<j)
22             i++;
23             
24         int k;
25         if(i<j)
26         {
27             k = a[i];
28             a[i] = a[j];
29             a[j] = k;
30         }
31     }
32     
33     a[left] = a[i];
34     a[i] = t;
35     Sort(left,i-1);
36     Sort(i+1,right);
37     return;
38 }
39 int main()
40 {
41     int m,n,i;
42     cin>>n;
43     for(i = 0;i < n;i++)
44     {
45         cin>>old[i];
46     }
47     cin>>m;
48 
49     int l,r,k,t,j;
50     for(i = 0;i < m;i++)
51     {
52         cin>>l>>r>>k;
53         t = l-1;        
54         for(j = 0;j < r-l+1;j++)      //用另一个数组保存后,再进行排序
55         {
56             a[j] = old[t++];
57         }
58         
59         Sort(0,j-1);
60         cout<<a[j-k]<<endl;
61     }
62     return 0;
63  } 
原文地址:https://www.cnblogs.com/boyiliushui/p/5176251.html