标签:
题目链接:http://poj.org/problem?id=2104
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 100007; int n, m; int sorted[N], tree[20][N], toleft[20][N]; void build(int L, int R, int dep) { if (L == R) return; int mid = (L + R) >> 1, same = mid - L + 1, lpos = L, rpos = mid + 1; for (int i = L; i <= mid; i++) { if (tree[dep][i] < sorted[mid]) same--; } for (int i = L; i <= R; i++) { if (tree[dep][i] < sorted[mid]) tree[dep+1][lpos++] = tree[dep][i]; else if (tree[dep][i] == sorted[mid] && same > 0) { tree[dep+1][lpos++] = tree[dep][i]; same--; } else tree[dep+1][rpos++] = tree[dep][i]; toleft[dep][i] = lpos - L; } build(L, mid, dep + 1); build(mid + 1, R, dep + 1); } int query(int L, int R, int l, int r, int k, int dep) { if (l == r) return tree[dep][l]; int mid = (L + R) >> 1, temp = toleft[dep][l-1]; if (l == L) temp = 0; int cnt = toleft[dep][r] - temp, newl, newr; if (cnt >= k) { newl = L + temp; newr = newl + cnt - 1; return query(L, mid, newl, newr, k, dep + 1); } else { newl = mid + 1 + l - L - temp; newr = mid + 1 + r - L - toleft[dep][r]; return query(mid + 1, R, newl, newr, k - cnt, dep + 1); } } int main() { while (scanf("%d%d", &n, &m) != EOF) { for (int i = 1; i <= n; i++) { scanf("%d", &sorted[i]); tree[0][i] = sorted[i]; } sort(sorted + 1, sorted + 1 + n); build(1, n, 0); for (int i = 0; i < m; i++) { int l, r, k; scanf("%d%d%d", &l, &r, &k); printf("%d\n", query(1, n, l, r, k, 0)); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/burning-flame/p/5749797.html