码迷,mamicode.com
首页 > 其他好文 > 详细

主席树模板

时间:2021-04-27 15:01:57      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:namespace   ++   主席树   sign   amp   roo   add   lse   nod   

#include <iostream>
#include <algorithm>
#include <cstdio>


using namespace std;
const int N = 2e5 * 20;
int a[N], b[N], root[N];
struct President_Tree {
    int idx;
    struct node {
        int l, r, data;
    }tr[N];
    inline void add(int &p, int q, int l, int r, int x) {
        p = ++idx;tr[p] = tr[q];tr[p].data ++ ;
        if (l == r)return;
        int mid = l + r >> 1;
        if (x <= mid)add(tr[p].l, tr[q].l, l, mid, x);
        else add(tr[p].r, tr[q].r, mid + 1, r, x);
    }
    inline int ask(int p, int q, int l, int r, int k) {
        if (l == r)return l;
        int cnt = tr[tr[p].l].data - tr[tr[q].l].data;
        int mid = l + r >> 1;
        if (k <= cnt)return ask(tr[p].l, tr[q].l, l, mid, k);
        else  return ask(tr[p].r, tr[q].r, mid + 1, r, k - cnt);
    }
}T;
signed main() {
    int n, m;
    while (~scanf("%d%d", &n, &m)) {
        T.idx = 0;
        for (int i = 1; i <= n; i ++)scanf("%d", &a[i]),b[i] = a[i];
        sort(b + 1, b + 1 + n);
        int nn = unique(b + 1, b + 1 + n)-b-1;
        for (int i = 1; i <= n; i ++)T.add(root[i], root[i-1], 1, nn, lower_bound(b + 1, b + 1 + nn, a[i])-b );
        while (m--) {
            int l, r, k;scanf("%d%d%d", &l, &r, &k);
            printf("%d\n", b[T.ask(root[r], root[l-1], 1, nn, k)]);
        }
    }
}

主席树模板

标签:namespace   ++   主席树   sign   amp   roo   add   lse   nod   

原文地址:https://www.cnblogs.com/Xiao-yan/p/14706621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!