【模板】普通平衡树
平衡树模板
解析
虽然是平衡树模板,然而我要写的是权值线段树...
珍贵的好看的我自己写的标...
(Code)
#include<cstdio>
using namespace std;
const int N = 1e5 + 5 , Len = 2e7 + 10 , V = 1e7 + 1;
struct segment{
int num[32 * N] , ls[32 * N] , rs[32 * N] , size;
void Size_update(){size = 1;}
void New(int p , int x)
{
if (x == 0 && !ls[p]) ls[p] = ++size;
if (x == 1 && !rs[p]) rs[p] = ++size;
}
void update(int x , int v , int l , int r , int p)
{
num[p] += v;
if (l == r && l == x) return;
int mid = (l + r) >> 1;
if (x <= mid) New(p , 0) , update(x , v , l , mid , ls[p]);
else New(p , 1) , update(x , v , mid + 1 , r , rs[p]);
}
int findk(int x , int y , int l , int r , int p)
{
if (x <= l && r <= y) return num[p];
int mid = (l + r) >> 1 , res = 0;
if (x <= mid && ls[p]) res += findk(x , y , l , mid , ls[p]);
if (y > mid && rs[p]) res += findk(x , y , mid + 1 , r , rs[p]);
return res;
}
int kfind(int k , int l , int r , int p)
{
if (l == r) return l;
int mid = (l + r) >> 1;
if (num[ls[p]] >= k) return kfind(k , l , mid , ls[p]);
else return kfind(k - num[ls[p]] , mid + 1 , r , rs[p]);
}
}seg;
int main()
{
int m , op , x;
scanf("%d" , &m);
seg.Size_update();
for(; m; m--)
{
scanf("%d%d" , &op , &x);
if (op == 1) x += V , seg.update(x , 1 , 1 , Len , 1);
else if (op == 2) x += V , seg.update(x , -1 , 1 , Len , 1);
else if (op == 3) x += V , printf("%d
" , seg.findk(1 , x - 1 , 1 , Len , 1) + 1);
else if (op == 4) printf("%d
" , seg.kfind(x , 1 , Len , 1) - V);
else if (op == 5) x += V , printf("%d
" , seg.kfind(seg.findk(1 , x - 1 , 1 , Len , 1) , 1 , Len , 1) - V);
else if (op == 6) x += V , printf("%d
" , seg.kfind(seg.findk(1 , x , 1 , Len , 1) + 1 , 1 , Len , 1) - V);
}
}