https://www.luogu.com.cn/record/167418203
第二个点下载后本地是对的,不知道怎么改。求各位大佬帮忙,悬关(附第二个点的数据)
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,tot,root,ans,cnt;
struct node
{
int siz,ls,rs,s,rnd;
}sh[N];
inline void update(int x)
{
sh[x].siz=sh[sh[x].ls].siz+sh[sh[x].rs].siz+1;
return ;
}
inline int add(int v)
{
sh[++cnt].siz=1;
sh[cnt].s=v;
sh[cnt].rnd=rand();
return cnt;
}
inline void split(int &x,int &y,int now,int k)
{
if(!now)
{
x=y=0;
return ;
}
if(sh[now].s<=k)
{
x=now;
split(sh[x].rs,y,sh[now].rs,k);
}
else
{
y=now;
split(x,sh[y].ls,sh[now].ls,k);
}
update(now);
}
inline int merge(int x,int y)
{
if(!x||!y) return x|y;
if(sh[x].rnd<sh[y].rnd)
{
sh[x].rs=merge(sh[x].rs,y);
update(x);
return x;
}
else
{
sh[y].ls=merge(sh[y].ls,x);
update(y);
return y;
}
}
inline void insert(int k)
{
int x,y;
split(x,y,root,k);
root=merge(merge(x,add(k)),y);
return ;
}
inline int queryrank(int v)
{
int x,y;
split(x,y,root,v-1);
int ans=sh[x].siz+1;
root=merge(x,y);
return ans;
}
inline void del(int k)
{
int x,y,z;
split(x,y,root,k);
split(x,z,x,k-1);
z=merge(sh[z].ls,sh[z].rs);
root=merge(merge(x,z),y);
return ;
}
inline int querykth(int x,int k)
{
if(sh[sh[x].ls].siz>=k)
return querykth(sh[x].ls,k);
else
{
if(sh[sh[x].ls].siz+1==k)return x;
else return querykth(sh[x].rs,k-sh[sh[x].ls].siz-1);
}
}
inline int querypre(int v)
{
int l,r,ans;
split(l,r,root,v-1);
ans=sh[querykth(l,sh[l].siz)].s;
root=merge(l,r);
return ans;
}
inline int querysuf(int v)
{
int l,r,ans;
split(l,r,root,v);
ans=sh[querykth(r,1)].s;
root=merge(l,r);
return ans;
}
int main()
{
scanf("%d",&n);
tot=root=0;
for(int i=1;i<=n;i++)
{
int opt,x;
scanf("%d%d",&opt,&x);
if(opt==1)insert(x);
if(opt==2)del(x);
if(opt==3)printf("%d\n",queryrank(x));
if(opt==4)printf("%d\n",sh[querykth(root,x)].s);
if(opt==5)printf("%d\n",querypre(x));
if(opt==6)printf("%d\n",querysuf(x));
}
return 0;
}
/*
输入:
5
1 24
1 25
1 20
3 23
3 23
输出:
2
2
*/