【模板】普通平衡树

【模板】普通平衡树

平衡树模板

解析

虽然是平衡树模板,然而我要写的是权值线段树...
珍贵的好看的我自己写的标...

(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);
	}
}
原文地址:https://www.cnblogs.com/leiyuanze/p/13466214.html