这题我 fhq 的 rk 赋的 1,然后全过了。
#include<bits/stdc++.h>
#define mem(a,x) memset(a,x,sizeof(a))
#define re register
#define il inline
using namespace std;
const int N=5e6+5;
struct fhq_treap{
int idx,rt,tag[N],ls[N],rs[N],sz[N],rk[N],pos;
int u,v,mid;
char s[N];
il int add(char x){
s[++idx]=x,sz[idx]=1,rk[idx]^=1;
return idx;
}
il void pushup(int p){
sz[p]=sz[ls[p]]+sz[rs[p]]+1;
}
il void flip(int x){
tag[x]^=1,swap(ls[x],rs[x]);
}
il void pushdown(int p){
if(tag[p]){
if(ls[p]) flip(ls[p]);
if(rs[p]) flip(rs[p]);
tag[p]=0;
}
}
il int merge(int u,int v){
if(!u || !v) return u+v;
if(rk[u]<rk[v]){
pushdown(u),rs[u]=merge(rs[u],v),pushup(u);
return u;
}
else{
pushdown(v),ls[v]=merge(u,ls[v]),pushup(v);
return v;
}
}
il void split(int p,int k,int &x,int &y){
if(!p){
x=y=0;
return ;
}
pushdown(p);
if(sz[ls[p]]+1<=k) x=p,split(rs[p],k-sz[ls[p]]-1,rs[p],y);
else y=p,split(ls[p],k,x,ls[p]);
pushup(p);
}
il void reverse(int x){
int l=pos+1,r=l+x-1;
split(rt,r,u,v),split(u,l-1,u,mid);
flip(mid);
rt=merge(merge(u,mid),v);
}
il void insert(int len){
getchar();
int l,mid=0,r;
while(len--)
mid=merge(mid,add(getchar()));
split(rt,pos,l,r);
rt=merge(merge(l,mid),r);
}
il void erase(int x){
int l=pos+1,r=l+x-1;
split(rt,r,u,v),split(u,l-1,u,mid);
rt=merge(u,v);
}
il char print(int p,int x){
pushdown(p);
if(sz[ls[p]]+1==x) return s[p];
if(sz[ls[p]]>=x) return print(ls[p],x);
return print(rs[p],x-sz[ls[p]]-1);
}
il void pre(){
pos--;
}
il void nxt(){
pos++;
}
il void move(int x){
pos=x;
}
}t;
int main(){
int _;
cin>>_;
while(_--){
string op;
int k,x;
cin>>op;
if(op=="Move"){
scanf("%d",&k);
t.move(k);
}
if(op=="Insert"){
scanf("%d",&k);
t.insert(k);
}
if(op=="Delete"){
scanf("%d",&k);
t.erase(k);
}
if(op=="Rotate"){
scanf("%d",&k);
t.reverse(k);
}
if(op=="Get"){
char x=t.print(t.rt,t.pos+1);
cout<<x;
if(x!='\n') cout<<'\n';
}
if(op=="Prev") t.pre();
if(op=="Next") t.nxt();
}
return 0;
}