#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int now=0,rt=0;
struct node
{
int lc,rc,key,pri,cnt,sz;
string sb;
#define l(x) t[x].lc
#define r(x) t[x].rc
#define v(x) t[x].key
#define p(x) t[x].pri
#define c(x) t[x].cnt
#define s(x) t[x].sz
#define sb(x) t[x].sb
}t[maxn];
inline void upt(const int &k)
{
s(k)=s(l(k))+s(r(k))+c(k);
}
inline void zig(int &k)
{
int y=l(k);
l(k)=r(y);
r(y)=k;
s(y)=s(k);
upt(k);
k=y;
}
inline void zag(int &k)
{
int y=r(k);
r(k)=l(y);
l(y)=k;
s(y)=s(k);
upt(k);
k=y;
}
void in(int &k,const int &key,const string &a)
{
if(!k)
{
k=++now;
sb(k)=a;
v(k)=key;
p(k)=rand();
c(k)=s(k)=1;
l(k)=r(k)=0;
return;
}
else ++s(k);
if(v(k)==key) ++c(k);
else
if(key<v(k))
{
in(l(k),key,a);
if( p(l(k))<p(k) ) zig(k);
}
else
{
in(r(k),key,a);
if( p(r(k))<p(k) ) zag(k);
}
return;
}
void sakuzyo(int &k,const int &key)
{
if(v(k)==key)
{
if(c(k)>1) --c(k),--s(k);
else if(!l(k)||!r(k))
k=l(k)+r(k);
else
if(p(l(k))<p(r(k)))
{
zig(k);
sakuzyo(k,key);
}
else
{
zag(k);
sakuzyo(k,key);
}
return;
}
--s(k);
if(key<v(k)) sakuzyo(l(k),key);
else sakuzyo(r(k),key);
return;
}
int quepre(const int &key)
{
int x=rt,res=-1*(2<<29);
while(x)
{
if(v(x)<key)
{
res=v(x);
x=r(x);
}
else x=l(x);
}
return res;
}
int quesuf(const int &key)
{
int x=rt,res=(2<<29);
while(x)
{
if(v(x)>key)
{
res=v(x);
x=l(x);
}
else x=r(x);
}
return res;
}
int quekth(int k)
{
int x=rt;
while(x)
{
if(s(l(x))<k&&s(l(x))+c(x)>=k) return v(x);
if(s(l(x))>=k) x=l(x);
else
{
k-=s(l(x))+c(x);
x=r(x);
}
}
return 0;
}
void squekth(int k)
{
int x=rt;
while(x)
{
if(s(l(x))<k&&s(l(x))+c(x)>=k)
cout<<sb(x)<<endl;
if(s(l(x))>=k) x=l(x);
else
{
k-=s(l(x))+c(x);
x=r(x);
}
}
return;
}
int querank(const int &key)
{
int x=rt,res=0;
while(x)
{
if(key==v(x)) return res+s(l(x))+1;
if(key<v(x)) x=l(x);
else
{
res+=s(l(x))+c(x);
x=r(x);
}
}
return 0;
}
string aaaa;
int main()
{
srand(time(0)*114514+1919810);
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>aaaa;
in(rt,i*100010,aaaa);
}
int m;scanf("%d",&m);
for(int i=1;i<=m;i++)
{
cin>>aaaa;
int p;cin>>p;
int now=quekth(p+1);
in(rt,now-1,aaaa);
}
int q;scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int p;cin>>p;
squekth(p+1);
}
return 0;
}
思路就是最开始的每本书他的权值差值为最多可能的插入操作数,插入的时候询问排名,然后插入即可
为什么会wa呢