额…我好像是在学主席树之前先学的这个东西【我也不知道为什么,懵~】
求第K大方法是值域线段树,求区间第K大时用一般的主席树,如果要求要支持修改的话,就会用到今天这个方法了。(当然还有许多其他的方法)。
【注:读者在阅读之前需要知晓树状数组和值域线段树的知识】
#include <cstdio>
#include <vector>
using namespace std;
const int N = 100010;
struct Node {
int cnt;
Node *ls, *rs;
}pool[N * 200], *tail = pool, *roots[N], *null;
int n, q;
int aa[N];
void init() {
//保证新增指针指空
null = ++tail;//提供一个新空间
null->ls = null;
null->rs = null;
null->cnt = 0;
}
Node *newnode() {
//新建空指针
Node *nd = ++tail;//提供一个新空间
nd->ls = null;
nd->rs = null;
nd->cnt = 0;
return nd;
}
void modify( vector<Node*> &va, int lf, int rg, int pos, int delta ) {
//va中存的是在pos之后所有掌管它的点,每一个点上有一颗size一样的值域线段树,所有值域线段树的值域都为1-N,每个点(每一棵树)存的是该点所掌管范围中各个数的个数
for( int t = 0