标签:hdu2665
1 10 1 1 4 2 3 5 6 7 8 9 0 1 3 2
2
#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].clear(); 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, t; scanf("%d", &t); while(t--) { 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; }
标签:hdu2665
原文地址:http://blog.csdn.net/chang_mu/article/details/41046625