题目链接:http://poj.org/problem?id=2761
区间第k大模板题,和这题一样HDU - 2665 kth number
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
struct node{
int l, r, sum;
}e[maxn * 20];
int a[maxn], sz[maxn];
int root[maxn];
int n, m, cnt;
void build(int l, int r, int &cur) {
cur = ++cnt;
e[cur].sum = 0;
if(l == r) return;
int mid = l + r >> 1;
build(l, mid, e[cur].l);
build(mid + 1, r, e[cur].r);
}
void update(int pre, int &cur, int l, int r, int val){
cur = ++ cnt;
e[cur] = e[pre];
e[cur].sum++;
if(l == r) return ;
int mid = l + r >> 1;
if(val > mid) update(e[pre].r, e[cur].r, mid + 1, r, val);
else update(e[pre].l, e[cur].l, l, mid, val);
}
int query(int cl, int cr, int l, int r, int k){
if(l == r) return l;
int sum = e[e[cr].l].sum - e[e[cl].l].sum;
int mid = l + r >> 1;
if(k <= sum) return query(e[cl].l, e[cr].l, l, mid, k);
else return query(e[cl].r, e[cr].r, mid + 1, r, k - sum);
}
int main()
{
cnt = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
sz[i] = a[i];
}
sort(sz + 1, sz + n + 1);
int len = unique(sz + 1, sz + n + 1) - (sz + 1);
build(1, len, root[0]);
for(int i = 1; i <= n; i++) {
int x = lower_bound(sz + 1, sz + len + 1, a[i]) - sz;
update(root[i-1], root[i], 1, len, x);
}
while(m--){
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
int x = query(root[l - 1], root[r], 1, len, k);
printf("%d\n", sz[x]);
}
return 0;
}