treap数组版

然而就是将指针的地方换成int引用

就是存个代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
struct node
{
	int val;
	int yuk;
	int siz;
	int key;
	int ch[2];
};
node t[501000];
int tail;
int cmp(int now,int val)
{
	if(t[now].val==val)	return -1;
	return t[now].val > val ? 0 : 1 ;
}
void sum(int &now)
{
	t[now].siz=t[t[now].ch[0]].siz+t[t[now].ch[1]].siz+t[now].yuk;
	return ;
}
void rotato(int &now,int base)
{
	int k=t[now].ch[base^1];
	t[now].ch[base^1]=t[k].ch[base];
	t[k].ch[base]=now;
	sum(now);	sum(k);
	now=k;
}
int New(int val)
{
	++tail;
	t[tail].ch[0]=t[tail].ch[1]=0;
	t[tail].siz=1;t[tail].yuk=1;
	t[tail].val=val;
	t[tail].key=rand();
	return tail;
}
void init()
{
	t[0].val=0;t[0].yuk=0;
	t[0].key=-1;
	t[0].ch[0]=t[0].ch[1]=0;
	srand(time(NULL));
	return ;
}
void insert(int &now,int val)
{
	if(now==0){now=New(val);return ;}
	int dir=cmp(now,val);
	if(dir==-1){t[now].yuk+=1;t[now].siz+=1;return ;}
	insert(t[now].ch[dir],val);
	if(t[t[now].ch[dir]].key>t[now].key)	rotato(now,dir^1);
	sum(now);
}
void del(int &now,int val)
{
	int dir=cmp(now,val);
	if(dir==-1)
		if(t[now].yuk>1){t[now].siz-=1,t[now].yuk-=1;return;}
		else
		{
			if(t[now].ch[1]&&t[now].ch[0])
			{
				int nxt= t[t[now].ch[0]].key > t[t[now].ch[1]].key ? 0 : 1;
				rotato(now,nxt^1);
				del(t[now].ch[nxt^1],val);
				sum(now);return ;
			}
			if(t[now].ch[1]){now=t[now].ch[1];sum(now);return ;}
			else {now=t[now].ch[0];sum(now);return ;}
		}
	del(t[now].ch[dir],val);sum(now);
	return;
}
int nxt(int now,int val)
{
	if(!now)	return 0x7fffffff;
	if(t[now].val>val)
		return min(t[now].val,nxt(t[now].ch[0],val));
	else
		return nxt(t[now].ch[1],val);
}
int pre(int now,int val)
{
	if(!now)	return -0x7fffffff;
	if(t[now].val<val)
		return max(t[now].val,pre(t[now].ch[1],val));
	else	
		return pre(t[now].ch[0],val);
}
int find(int &now,int val)
{
	int dir=cmp(now,val);
	if(dir==-1)	return t[t[now].ch[0]].siz+1;
	return find(t[now].ch[dir],val) + ( dir ? t[t[now].ch[0]].siz + t[now].yuk : 0);
}
int kth(int &now,int k)
{
	if(t[t[now].ch[0]].siz<k&&t[t[now].ch[0]].siz+t[now].yuk>=k)
		return t[now].val;
	if(k<=t[t[now].ch[0]].siz)
		return kth(t[now].ch[0],k);
	else
		return kth(t[now].ch[1],k-t[t[now].ch[0]].siz-t[now].yuk);
}
int root;
void visit(int now)
{
	if(!now)
		return ;
	visit(t[now].ch[0]);
	printf("%d ",t[now].val);
	visit(t[now].ch[1]);
	return ;
}
int main()
{
	int n;
	scanf("%d",&n);
	int a,b;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a,&b);
		switch(a)
		{
			case 1:insert(root,b);break;
			case 2:del(root,b);break;
			case 3:printf("%d\n",find(root,b));break;
			case 4:printf("%d\n",kth(root,b));break;
			case 5:insert(root,b);printf("%d\n",pre(root,b));del(root,b);break;
			case 6:insert(root,b);printf("%d\n",nxt(root,b));del(root,b);break;
		}
		//visit(root);printf("\n");
	}
}
posted @ 2018-06-10 20:38  Lance1ot  阅读(232)  评论(0编辑  收藏  举报