class Splay
{
class node
{
int v,father;
int ch[]=new int[2];
int sum;
int recy;
};
Splay()
{
for(int i=0;i<e.length;i++)
{
e[i]=new node();
}
}
node[] e=new node[100010];
int n,points;//
void update(int x)
{
e[x].sum=e[e[x].ch[0]].sum+e[e[x].ch[1]].sum+e[x].recy;
}
int identify(int x)
{
return e[e[x].father].ch[0]==x?0:1;
}
void connect(int x,int f,int son)
{
e[x].father=f;
e[f].ch[son]=x;
}
void rotate(int x)
{
int y=e[x].father;
int mroot=e[y].father;
int mrootson=identify(y);
int yson=identify(x);
int B=e[x].ch[yson^1];
connect(B,y,yson);connect(y,x,(yson^1));connect(x,mroot,mrootson);
update(y);update(x);
}
void splay(int at,int to)
{
to=e[to].father;
while(e[at].father!=to)
{
int up=e[at].father;
if(e[up].father==to) rotate(at);
else if(identify(up)==identify(at))
{
rotate(up);
rotate(at);
}
else
{
rotate(at);
rotate(at);
}
}
}
int crepoint(int v,int father)
{
n++;
e[n].v=v;
e[n].father=father;
e[n].sum=e[n].recy=1;
e[n].ch[0]=e[n].ch[1]=0;
return n;
}
void destroy(int x)
{
e[x].v=e[x].ch[0]=e[x].ch[1]=e[x].sum=e[x].father=e[x].recy=0;
if(x==n) n--;
}
void init()
{
points=n=e[0].ch[1]=0;
e[e[0].ch[1]].v=e[e[0].ch[1]].father=e[e[0].ch[1]].sum=e[e[0].ch[1]].recy=e[e[0].ch[1]].ch[0]=e[e[0].ch[1]].ch[1]=0;
}
int getroot(){return e[0].ch[1];}
int find(int v)
{
int now=e[0].ch[1];
while(true)
{
if(e[now].v==v)
{
splay(now,e[0].ch[1]);
return now;
}
int next=v<e[now].v?0:1;
if(e[now].ch[next]==0) return 0;
now=e[now].ch[next];
}
}
int build(int v)
{
points++;
if(points==1)
{
e[0].ch[1]=n+1;
crepoint(v,0);
}
else
{
int now=e[0].ch[1];
}
return 0;
}
void push(int v)
{
int add=build(v);
splay(add,e[0].ch[1]);
}
void pop(int v)//
{
int deal=find(v);
if(deal==0) return;
points--;
if(e[deal].recy>1)
{
e[deal].recy--;
e[deal].sum--;
return;
}
if(e[deal].ch[0]==0)
{
e[0].ch[1]=e[deal].ch[1];
e[e[0].ch[1]].father=0;
}
else
{
int lef=e[deal].ch[0];
while(e[lef].ch[1]!=0) lef=e[lef].ch[1];
splay(lef,e[deal].ch[0]);
int rig=e[deal].ch[1];
connect(rig,lef,1);connect(lef,0,1);
update(lef);
}
destroy(deal);
}
int rank(int v)
{
int ans=0,now=e[0].ch[1];
while(true)
{
if(e[now].v==v)
{
ans+=e[e[now].ch[0]].sum;
splay(now,e[0].ch[1]);
return ans+1;
}
if(now==0) return 0;
if(v<e[now].v) now=e[now].ch[0];
else
{
ans=ans+e[e[now].ch[0]].sum+e[now].recy;
now=e[now].ch[1];
}
}
}
int atrank(int x)
{
if(x>points) return -1000000;
int now=1000000;
while(true)
{
int minused=e[now].sum-e[e[now].ch[1]].sum;
if(x>e[e[now].ch[0]].sum&&x<=minused) break;
if(x<minused) now=e[now].ch[0];
else
{
x=x-minused;
now=e[now].ch[1];
}
}
splay(now,e[0].ch[1]);
return e[now].v;
}
int upper(int v)
{
int now=e[0].ch[1];
int result=100000;
while(now>0)
{
if(e[now].v>=v&&e[now].v<result) result=e[now].v;
if(v<e[now].v) now=e[now].ch[0];
else now=e[now].ch[1];
}
return result;
}
int lower(int v)
{
int now=e[0].ch[1];
int result=-1000;
while(e[0].ch[1]>0)
{
if(e[now].v<=v&&e[now].v>result) result=e[now].v;
if(v>e[now].v) now=e[now].ch[1];
else now=e[now].ch[0];
}
return result;
}
};
public class Main{
public static void main(String args[])
{
Splay tt=new Splay();
tt.build(100000);
System.out.println("qwq");
}
}
java 板子dddd
最新推荐文章于 2024-10-12 22:35:37 发布