明明本地跑的没问题,自从用了srand(time(0))后,每次交都有不一样的tle,而且还是最小的几个数据点经常tle
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-48;c=getchar();}
return x*f;
}
int n,m;
int id[200007];
struct fhq_treap{int ls,rs,fa,size,val,key;}fhq[2000007];
int N,Root,_x,_y,_z;
int newNode(int val)
{
N++;
fhq[N].val=val;
fhq[N].key=rand();
fhq[N].size=1;
id[val]=N;
return N;
}
inline void pushUp(int root){fhq[root].size=fhq[fhq[root].ls].size+fhq[fhq[root].rs].size+1;}
void split(int root,int k,int &LR,int &RR,int faLR=0,int faRR=0){
if(!root){LR=RR=0;return;}
if(k<=fhq[fhq[root].ls].size)
{
fhq[root].fa=faRR;RR=root;
split(fhq[root].ls,k,LR,fhq[root].ls,faLR,root);
}
else
{
fhq[root].fa=faLR;LR=root;
split(fhq[root].rs,k-(fhq[fhq[root].ls].size+1),fhq[root].rs,RR,root,faRR);
}
pushUp(root);
}
int merge(int LR,int RR){
if(!LR||!RR) return LR|RR;
if(fhq[LR].key<fhq[RR].key)
{
fhq[LR].rs=merge(fhq[LR].rs,RR);
fhq[fhq[LR].rs].fa=LR;
pushUp(LR);return LR;
}
else{
fhq[RR].ls=merge(LR,fhq[RR].ls);
fhq[fhq[RR].ls].fa=RR;
pushUp(RR);return RR;
}
}
inline void insert(int val,int pos){
split(Root,pos,_x,_y);
Root=merge(merge(_x,newNode(val)),_y);
}
inline void erase(int k){
split(Root,k,_x,_z);split(_x,k-1,_x,_y);
_y=merge(fhq[_y].ls,fhq[_y].rs);
Root=merge(merge(_x,_y),_z);
}
inline int Kth(int k){
split(Root,k,_x,_z);split(_x,k-1,_x,_y);
int ans=fhq[_y].val;Root=merge(_x,merge(_y,_z));
return ans;
}
int find(int u)
{
int ans(fhq[fhq[u].ls].size+1);
while(u^Root)
{
if(fhq[fhq[u].fa].ls^u) ans+=fhq[fhq[fhq[u].fa].ls].size+1;
u=fhq[u].fa;
}
return ans;
}
int main()
{
srand(time(0));
n=read(),m=read();
int X,t;
for(int i=1;i<=n;i++){
X=read();
insert(X,i);
}
char opt[10];
for(int i=1;i<=m;i++)
{
scanf("%s",opt);X=read();
if(opt[0]=='T')
{
int k=find(id[X]);
erase(k);
Root=merge(newNode(X),Root);
}
if(opt[0]=='B')
{
int k=find(id[X]);
erase(k);
insert(X,n-1);
}
if(opt[0]=='I')
{
t=read();
int k=find(id[X]);
erase(k);
split(Root,k+t-1,_x,_y);
merge(_x,merge(newNode(X),_y));
}
if(opt[0]=='A') printf("%d\n",find(id[X])-1);
if(opt[0]=='Q') printf("%d\n",Kth(X));
}
return 0;
}