社区讨论
0分求调,玄2关
P2343宝石管理系统参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjhd2qo
- 此快照首次捕获于
- 2025/11/04 02:35 4 个月前
- 此快照最后确认于
- 2025/11/04 02:35 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int rt,m,q,op,tmp,cnt;
struct str{
int l,r,v,sz;
}t[500005];
int find(int x,int val)
{
if(x==0) return 0;
if(val<t[x].v) return find(t[x].l,val);
else if(val>t[x].v) return find(t[x].r,val)+t[t[x].l].sz+1;
return t[t[x].l].sz+1;
}
void update(int x){t[x].sz=t[t[x].l].sz+t[t[x].r].sz+1;}
void lot(int &x)
{
int y=t[x].r;
t[x].r=t[y].l;
t[y].l=x;
update(x);
update(y);
x=y;
return ;
}
void rot(int &x)
{
int y=t[x].l;
t[x].l=t[y].r;
t[y].r=x;
update(x);
update(y);
x=y;
return ;
}
void splay(int &x,int val)
{
if(x==0||val<1||val>t[x].sz) return ;
if(val<=t[t[x].l].sz)
{
if(val<=t[t[t[x].l].l].sz)
{
splay(t[t[x].l].l,val);
rot(x);
rot(x);
}
else if(val>t[t[t[x].l].l].sz+1)
{
splay(t[t[x].l].r,val-t[t[t[x].l].l].sz-1);
lot(t[x].l);
rot(x);
}
else rot(x);
}
else if(val>t[t[x].l].sz+1)
{
int rv=val-t[t[t[x].l].l].sz-1;
if(rv<=t[t[t[x].r].l].sz)
{
splay(t[t[x].r].l,rv);
rot(t[x].r);
lot(x);
}
else if(rv>t[t[t[x].r].l].sz+1)
{
splay(t[t[x].r].r,rv-t[t[t[x].r].l].sz-1);
lot(x);
lot(x);
}
else lot(x);
}
update(x);
return ;
}
int hb(int x,int y)
{
if(x==0) return y;
if(y==0) return x;
splay(x,t[x].sz);
t[x].r=y;
update(x);
return x;
}
void cf(int x,int val,int &l,int &r)
{
if(x==0)
{
l=r=0;
return ;
}
if(val<=t[t[x].l].sz)
{
cf(t[x].l,val,l,t[x].l);
x=r;
}
else
{
cf(t[x].r,val-t[t[x].l].sz-1,t[x].r,r);
x=l;
}
update(x);
return ;
}
void add(int val)
{
int x=rt,res=0;
while(x)
{
if(t[x].v<val)
{
res+=t[t[x].l].sz+1;
x=t[x].r;
}
else x=t[x].l;
}
int ll=0,rr=0;
cf(rt,res,ll,rr);
t[++cnt]={0,0,val,1};
rt=hb(hb(ll,cnt),rr);
return ;
}
int finds(int val)
{
int x=rt;
while(x)
{
if(val==t[t[x].l].sz+1) break;
else if(val<=t[t[x].l].sz) x=t[x].l;
else
{
val-=t[t[x].l].sz+1;
x=t[x].r;
}
}
splay(rt,find(rt,t[x].v));
return t[x].v;
}
int main()
{
scanf("%d%d",&m,&q);
for(int i=1;i<=m;i++)
{
scanf("%d",&tmp);
add(tmp);
}
for(int i=1;i<=q;i++)
{
scanf("%d%d",&op,&tmp);
if(op==1) printf("%d\n",finds(cnt-tmp+1));
else if(op==2) add(tmp);
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...