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