主席树无修改查询区间第k大

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30358129/article/details/82048554
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define mid (l+r>>1)
#define lson (o<<1)
#define rson (o<<1|1)
using namespace std;
const int N = 1e5+100;
struct node{
    int x,pos;
    bool operator < (node b)const{
        return x<b.x;
    }
}s[N];
struct TREE{
    int l,r,x;
}tree[N*20];
int rk[N],tot,rt[N];
void build(int o,int l,int r){
    tot ++;
    if(l==r) return ;
    tree[o].l = lson;
    tree[o].r = rson;
    build(lson,l,mid);
    build(rson,mid+1,r);
}
void insert(int &o,int l,int r,int data){
    tree[++tot] = tree[o];
    o = tot;
    tree[o].x++;
    if(l==r) return ;
    if(mid>=data) insert(tree[o].l,l,mid,data);
    else insert(tree[o].r,mid+1,r,data);
}
int query(int lo,int ro,int l,int r,int data){
    if(l==r) return l;
    int k = tree[tree[ro].l].x-tree[tree[lo].l].x;
    if(k>=data) return query(tree[lo].l,tree[ro].l,l,mid,data);
    else return query(tree[lo].r,tree[ro].r,mid+1,r,data-k);
}
int main(){
    //freopen("a.txt","r",stdin);
    ios::sync_with_stdio(0);
    int n,m,i;
    cin>>n>>m;
    for(i = 1;i <= n;i ++){
        cin>>s[i].x;
        s[i].pos = i;
    }
    sort(s+1,s+n+1);
    for(i = 1;i <= n;i ++) rk[s[i].pos] = i;
    rt[0] = 0;
    tree[0].l = tree[0].r = tree[0].x = 0;
    for(i = 1;i <= n;i ++){
        rt[i] = rt[i-1];
        insert(rt[i],1,n,rk[i]);
    }
    for(i = 1;i <= m;i ++){
        int l,r,k;
        cin>>l>>r>>k;
        cout<<s[query(rt[l-1],rt[r],1,n,k)].x<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_30358129/article/details/82048554