标签:poj2104
| Time Limit: 20000MS | Memory Limit: 65536K | |
| Total Submissions: 38379 | Accepted: 12480 | |
| Case Time Limit: 2000MS | ||
Description
Input
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
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#define maxn 100005
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
vector<int> T[maxn << 2];
int N, Q;
void build(int l, int r, int rt) {
if(l == r) {
int val;
scanf("%d", &val);
T[rt].push_back(val);
return;
}
int mid = (l + r) >> 1;
build(lson);
build(rson);
T[rt].resize(r - l + 1); // Attention
merge(T[rt<<1].begin(), T[rt<<1].end(), T[rt<<1|1].begin(), T[rt<<1|1].end(), T[rt].begin());
}
int query(int L, int R, int val, int l, int r, int rt) {
if(L == l && R == r) {
return upper_bound(T[rt].begin(), T[rt].end(), val) - T[rt].begin();
}
int mid = (l + r) >> 1;
if(R <= mid) return query(L, R, val, lson);
else if(L > mid) return query(L, R, val, rson);
return query(L, mid, val, lson) + query(mid + 1, R, val, rson);
}
int main() {
int a, b, c, k, left, right, mid;
scanf("%d%d", &N, &Q);
build(1, N, 1);
while(Q--) {
scanf("%d%d%d", &a, &b, &k);
left = -1; right = N - 1;
while(right - left > 1) { // binary search
mid = (left + right) >> 1;
c = query(a, b, T[1][mid], 1, N, 1);
if(c >= k) right = mid;
else left = mid;
}
printf("%d\n", T[1][right]);
}
return 0;
}标签:poj2104
原文地址:http://blog.csdn.net/chang_mu/article/details/41045705