权值线段树

/*
 * 权值线段树
 * 仅能维护小数值数据.对于大数值数据需离散化,但会从在线数据结构退化为离线数据结构.
 * 本质上,权值线段树就是线段树的一种特殊维护
 * 
 * 权值线段树是主席树前置知识
*/

/*
 * Description
 * [模板]权值线段树: 请使用权值线段树,实现以下操作
 * -1:插入数x
 * -2:删除数x
 * -3:查询当前比数x小的数的个数
 * -4:查询排名为k的数
 * 
 * 数据范围: 1 <= x <= 1e6 
*/


#include <cstdio>
const int N = 1e6+5;

int tree[N<<2];
void update(int l,int r,int rt,int num,int delta){ // 操作1,2
    tree[rt] += delta;
    if(l == r){
        return;
    }else{
        int mid = l+r>>1;
        if(num <= mid){
            update(l,mid,rt<<1,num,delta);
        }else{
            update(mid+1,r,rt<<1|1,num,delta);
        }
    }
}

int countlower(int l,int r,int rt,int num){
    if(r < p){
        return tree[rt];
    }else{
        int ans = 0;
        ans += rank(l,l+r>>1,rt<<1,num); // [l,mid]有多少数小于num
        if(1+(l+r>>1) < num){ // [mid+1,r] 有多少数小于num
            ans += rank(1+(l+r>>1),r,rt<<1|1,num);
        }
        return res;
    }
}


int kmin(int l,int r,int rt,int k){
    while(l < r){
        if(k <= tree[rt]){
            r = l+r>>1;
            rt = rt<<1;
        }else{
            l = (l+r>>1)+1;
            rt = rt<<1|1;
            k -= tree[rt<<1];
        }
    }
    return l;
}


---- suffer now and live the rest of your life as a champion ----
原文地址:https://www.cnblogs.com/popodynasty/p/13956201.html