问题描述
给定一个序列,每次询问序列中第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
1 2 3 4 5
2
1 5 2
2 3 2
样例输出
4
2
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 }