zoukankan      html  css  js  c++  java
  • Treap 模板

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #define N 100010
    using namespace std;
    int len=0,root=1;
    struct
    {
    	int v,s,l,r,si;
    }a[N];
    void update (int x)
    {
    	a[x].si=a[a[x].l].si+a[a[x].r].si+1;
    }
    void split(int rt,int &x,int &y,int key)
    {
    	if(!rt) x=y=0;
    	else
    	{
    		if(a[rt].v<=key)	 
    		{
    			x=rt;
    			split(a[rt].r,a[x].r,y,key);
    		}
    		else
    		{
    			y=rt;
    			split(a[rt].l,x,a[y].l,key);
    		}
    		update(rt);
    	}
    }
    void merge(int &rt,int x,int y)
    {
    	if(x==0) rt=y; 
    	else if(y==0) rt=x;
    	else
    	{
    		if(a[x].s<a[y].s)
    		{
    			rt=x;
    			merge(a[rt].r,a[x].r,y);
    		}
    		else 
    		{
    			rt=y;
    			merge(a[rt].l,x,a[y].l);
    		}
    		update(rt);
    	}
    }
    int add(int v)
    {
    	a[len].l=a[++len].r=0;
    	a[len].v=v;
    	a[len].s=rand()*rand();
    	a[len].si=1;
    	return len;
    }
    int get(int rt,int v)
    {
    	while(a[a[rt].l].si+1!=v)
    	{
    		if(a[a[rt].l].si+1<v)
    		{
    			v-=a[a[rt].l].si+1;
    			rt=a[rt].r;
    		}
    		else rt=a[rt].l;
    	}
    	return a[rt].v;
    }
    int main()
    {
    	int n,i,op,v;
    	scanf("%d",&n);
    	add(1e+9);
    	a[1].si=0;
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d%d",&op,&v);
    		if(op==1)
    		{
    			int x=0,y=0,k=add(v);
    			split(root,x,y,v);
    			merge(x,x,k);
    			merge(root,x,y);
    		}
    		else if(op==2)
    		{
    			int x=0,y=0,z=0;
    			split(root,x,y,v);
    			split(x,x,z,v-1);
    			merge(z,a[z].l,a[z].r);
    			merge(x,x,z);
    			merge(root,x,y);
    		}
    		else if(op==3)
    		{
    			int x=0,y=0;
    			split(root,x,y,v-1);
    			printf("%d
    ",a[x].si+1);
    			merge(root,x,y);
    		}
    		else if(op==4)
    		{
    			printf("%d
    ",get(root,v));
    		}
    		else if(op==5)
    		{
    			int x=0,y=0;
    			split(root,x,y,v-1);
    			printf("%d
    ",get(x,a[x].si));
    			merge(root,x,y);
    		}
    		else 
    		{
    			int x=0,y=0;
    			split(root,x,y,v);
    			printf("%d
    ",get(y,1));
    			merge(root,x,y);
    		}
    	}
    	return 0;
    }
    
    哈哈哈哈哈哈哈哈哈哈
  • 相关阅读:
    .NET 4.5 is an in-place replacement for .NET 4.0
    python Argparse模块的使用
    linux的fork(), vfork()区别
    Linux 的 strace 命令
    NTFS系统的ADS交换数据流
    Git和.gitignore
    GIT常用命令
    OSChina码云试用
    tcpdump用法
    linux网卡混杂模式
  • 原文地址:https://www.cnblogs.com/LZA119/p/14623424.html
Copyright © 2011-2022 走看看