Time Limit: 20000MS | Memory Limit: 65536K | |
Total Submissions: 30949 | Accepted: 9484 | |
Case Time Limit: 2000MS |
Description
That is, given an array a[1...n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: "What would be the k-th number in a[i...j] segment, if this segment was sorted?"
For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2...5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.
Input
The second line contains n different integer numbers not exceeding 109 by their absolute values --- the array for which the answers should be given.
The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).
Output
Sample Input
7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3
Sample Output
5 6 3
Hint
Source
更好的方法應該是用線段樹 ,可是在使用printf scanf 輸入輸出的情況下 ,這種給每個元素編號的方式也可以通過。
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100005
struct data{
int pos;
int val;
};
data D[N];
int cmp(const void*a ,const void*b){
return static_cast<const data*>(a)->val-static_cast<const data*>(b)->val;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int p = 1; p<=n ; p++){
scanf("%d",&D[p].val);
D[p].pos = p;
}
qsort(D+1,n,sizeof(D[0]),cmp);
while(m--){
int i,j,k;
int count=0;
int w;
scanf("%d%d%d",&i,&j,&k);
for(w=1;w<=n;w++){
if(i<=D[w].pos&&D[w].pos<=j){
count++;
if(count==k)
break;
}
}
printf("%dn",D[w].val);
}
return 0;
}