然而过不去你谷的模板
思路:
值域线段树\([l,r]\)代表一棵值域在\([l,r]\)范围内的点构成的一颗平衡树平衡树的\(BST\)权值为点在序列中的位置
查询区间第\(k\)大值时
左区间在\([l,r]\)范围内的树的大小与\(k\)比较
大了进去,小了减掉换一边
关于建树
递归建估计是\(O(nlog^2n)\)的
Code:
#include#include #include #include const int N=1e5+10;int ch[N*20][2],val[N*20],siz[N*20],pos[N*20],root[N<<2],tot;#define ls ch[now][0]#define rs ch[now][1]int n,m,n_,a[N],b[N];void updata(int now){siz[now]=siz[ls]+siz[rs]+1;}void split(int now,int k,int &x,int &y){ if(!now) {x=y=0;return;} if(pos[now]<=k) x=now,split(rs,k,rs,y); else y=now,split(ls,k,x,ls); updata(now);}int Merge(int x,int y){ if(!x||!y) return x+y; if(val[x]