平衡树 52pts 剩下全re 求助
查看原帖
平衡树 52pts 剩下全re 求助
502949
Mirasycle楼主2022/8/18 09:24
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e4+10;
const int inf=0x3f3f3f3f;
struct node{
	int lc,rc;
	int rank,val;
	int cnt,size;
	int val2;
	#define lc(x) a[x].lc
	#define rc(x) a[x].rc
	#define rank(x) a[x].rank
	#define val(x) a[x].val
	#define cnt(x) a[x].cnt
	#define size(x) a[x].size
	#define val2(x) a[x].val2
}a[maxn];
int b[maxn];
int root;
struct Treap{
	int tot;
	int newnode(int v,int v2){
		val(++tot)=v;
		val2(tot)=v2;
		rank(tot)=rand();
		cnt(tot)=size(tot)=1;
		return tot;
	}
	void update(int p){
		size(p)=size(lc(p))+size(rc(p))+cnt(p);
	}
	void build_tree(){
		tot=0; root=1;
		newnode(-inf,-inf);
		newnode(inf,inf);
		a[1].rc=2;
		update(1);
	}
	void rotate_left(int &p){
		int q=rc(p);
		rc(p)=lc(q);
		lc(q)=p;
		p=q;
		update(lc(p));
		update(p);
	}
	void rotate_right(int &p){
		int q=lc(p);
		lc(p)=rc(q);
		rc(q)=p;
		p=q;
		update(rc(p));
		update(p);
	}
	void insert(int &p,int v,int v2){
		if(p==0){
			p=newnode(v,v2);
			return ;
		}
		if(v<val(p)){
			insert(lc(p),v,v2);
			if(rank(lc(p))>rank(p)) rotate_right(p);
		}else if(v==val(p)){
			if(v2<val2(p)){
				insert(lc(p),v,v2);
				if(rank(lc(p))>rank(p)) rotate_right(p);
			}else{
				insert(rc(p),v,v2);
				if(rank(rc(p))>rank(p)) rotate_left(p);
			}
		}else{
			insert(rc(p),v,v2);
			if(rank(rc(p))>rank(p)) rotate_left(p);
		}
		update(p);
		return ;
	}
	void remove(int &p,int v,int v2){
		if(p==0) return ;
		if(v<val(p)){
			remove(lc(p),v,v2);
		}else if(v>val(p)){
			remove(rc(p),v,v2);
		}else{
			if(v2<val2(p)){
				remove(lc(p),v,v2);
			}else if(v2>val2(p)){
				remove(rc(p),v,v2);
			}else if(rc(p)||lc(p)){
				if(rc(p)==0||rank(rc(p))<rank(lc(p))){
					rotate_right(p);
					remove(rc(p),v,v2);
				}else{
					rotate_left(p);
					remove(lc(p),v,v2);
				}
			}else{
				p=0;
			}
		}
		update(p);
		return ;
	}
	int getrank(int p,int v,int v2){
		if(p==0) return 0;
		if(v==val(p)){
			if(v2==val2(p)) return size(lc(p))+1;
			else if(v2<val2(p)) return getrank(lc(p),v,v2);
			else return getrank(rc(p),v,v2)+size(lc(p))+cnt(p); 
		}
		if(v<val(p)) return getrank(lc(p),v,v2);
		return getrank(rc(p),v,v2)+size(lc(p))+cnt(p); 
	}
}tree;
int main(){
	int n,q;
	cin>>n>>q;
	tree.build_tree();
	for(int i=1;i<=n;i++){
		cin>>b[i];
		tree.insert(root,b[i],i); 
	}
	for(int i=1;i<=q;i++){
		int type;
		cin>>type;
		if(type==1){
			int x,v;
			cin>>x>>v;
			tree.remove(root,b[x],x);
			b[x]=v;
			tree.insert(root,b[x],x);
		}else{
			int x;
			cin>>x;
			int ra=tree.getrank(root,b[x],x)-1;
			cout<<ra<<endl;
		}
	}
	return 0;
}
2022/8/18 09:24
加载中...