简单的区间维护就写了排名分裂和简单的Insert,没想到WA了。。。
是我的string的使用有问题吗?
Code:
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<ctime>
const int M=1e5+2e2+5;
int cnt,root,f[M],s[M],rnd[M],chi[M][2];std::string str[M];
void undate(int now)
{
s[now]=s[chi[now][0]]+s[chi[now][1]]+1;
}
void split(int now,int k,int&x,int&y)
{
if(!now)return void(x=y=0);
if(k<=s[chi[now][0]])split(chi[y=now][0],k,x,chi[now][0]);
else split(chi[x=now][1],k-s[chi[now][0]]-1,chi[now][1],y);
undate(now);
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(rnd[x]<rnd[y])return chi[x][1]=merge(chi[x][1],y),undate(x),x;
else return chi[y][0]=merge(x,chi[y][0]),undate(y),y;
}
void Insert(int rank)
{
int x,y;
split(root,rank-1,x,y);
rnd[++cnt]=rand();
root=merge(merge(x,cnt),y);
}
signed main()
{
int i,x,n,m;
srand(time(NULL));
std::ios::sync_with_stdio(false);
std::cin.tie(0);std::cout.tie(0);
std::cin>>n;
for(i=1;i<=n;++i)std::cin>>str[i],Insert(i);
std::cin>>m;
for(i=n+1;i<=n+m;++i)std::cin>>str[i]>>x,Insert(++x);
for(std::cin>>m;m;--m)
{
int a,b;
std::cin>>x;
split(root,x,a,b);x=b;
while(chi[x][0])x=chi[x][0];
root=merge(a,b);
std::cout<<str[x]<<"\n";
}
}