K-th Number

K-th Number

题解:

A: 主席树模板。

B: 是的!!!

代码:

#include<stdio.h>
#include<vector>
#include<algorithm>

using namespace std;

const int N = 1e5 + 7;

struct hjt{
    int sum, l, r;
}tree[24 * N];

int top = 1, rt[N], a[N];
#define m (l + r) / 2

void update(int pos, int last, int &now, int l, int r){
    now = top++;
    tree[now] = tree[last];
    tree[now].sum++;
    if(l == r)return;
    if(pos <= m) update(pos, tree[last].l, tree[now].l, l, m);
    else update(pos, tree[last].r, tree[now].r, m + 1, r);
}

int query(int k, int last, int now, int l, int r){
    if(l == r)return l;
    int sum = tree[tree[now].l].sum - tree[tree[last].l].sum;
    if(sum >= k) return query(k, tree[last].l, tree[now].l, l, m);
    return query(k - sum, tree[last].r, tree[now].r, m + 1, r);
}

vector<int>g;

int get_id(int x){
    return lower_bound(g.begin(), g.end(), x) - g.begin() + 1;
}

int main(){
    int n, q; scanf("%d %d", &n, &q);
   
    for(int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
        g.push_back(a[i]);
    }
    sort(g.begin(), g.end());
    g.erase(unique(g.begin(), g.end()), g.end());
    n = g.size();
    for(int i = 1; i <= n; i++){
        int pos = get_id(a[i]);
        update(pos, rt[i - 1], rt[i], 1, n);
    }
    while(q--){
        int l, r, k;
        scanf("%d %d %d", &l, &r, &k);
        printf("%d\n", g[query(k, rt[l - 1], rt[r], 1, n) - 1]);
    }
}
posted @ 2020-07-10 15:07  ccsu_zhaobo  阅读(51)  评论(0编辑  收藏  举报