poj3580 序列之王 fhqtreap
fhqtreap的写法 操作其实都差不多哇
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=200050; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,m,sum; struct node{ node *l,*r; int sz,v,rnd,rev,tag,mn; void init(int w){sz=1; v=w; rnd=rand(); mn=w;} void add(int w){tag+=w; v+=w; mn+=w;} void revs(){rev^=1; swap(l,r);} void up(){ sz=1; mn=v; if(l) sz+=l->sz,mn=min(mn,l->mn); if(r) sz+=r->sz,mn=min(mn,r->mn); } void dn(){ if(rev){if(l) l->revs(); if(r) r->revs(); rev=0;} if(tag){if(l) l->add(tag); if(r) r->add(tag); tag=0;} } void split(node*&lw,node*&rw,int k){ if(!this){lw=0; rw=0; return ;} dn(); int ls=l?l->sz:0; if(ls>=k){ l->split(lw,l,k); rw=this; } else{ r->split(r,rw,k-ls-1); lw=this; } up(); } }tr[M],*rt; node *merge(node *a,node *b){ if(!a) return b; if(!b) return a; if(a->rnd>b->rnd){ a->dn(); a->r=merge(a->r,b); a->up(); return a; }{ b->dn(); b->l=merge(a,b->l); b->up(); return b; } } int main() { int l,r,w; char ch[15]; n=read(); for(int i=1;i<=n;i++) w=read(),tr[i].init(w),rt=merge(rt,tr+i); sum=n; m=read(); while(m--){ scanf("%s",ch); if(ch[0]=='A'){ node *p1,*p2,*p3; l=read(); r=read(); w=read(); rt->split(p2,p3,r); p2->split(p1,p2,l-1); p2->add(w); rt=merge(merge(p1,p2),p3); } else if(ch[0]=='M'){ node *p1,*p2,*p3; l=read(); r=read(); rt->split(p2,p3,r); p2->split(p1,p2,l-1); printf("%d\n",p2->mn); rt=merge(merge(p1,p2),p3); } else if(ch[0]=='R'&&ch[4]=='R'){ node *p1,*p2,*p3; l=read(); r=read(); if(l==r) continue; rt->split(p2,p3,r); p2->split(p1,p2,l-1); p2->revs(); rt=merge(merge(p1,p2),p3); } else if(ch[3]=='O'){ node *p1,*p2,*p3,*p4; l=read(); r=read(); w=read()%(r-l+1); if(l==r) continue; rt->split(p2,p4,r); p2->split(p1,p2,l-1); p2->split(p2,p3,r-w-l+1); rt=merge(merge(p1,p3),merge(p2,p4)); } else if(ch[0]=='I'){ node *p1,*p2; l=read(); w=read(); tr[++sum].init(w); rt->split(p1,p2,l); rt=merge(merge(p1,tr+sum),p2); } else if(ch[0]=='D'){ node *p1,*p2,*p3; l=read(); rt->split(p2,p3,l); p2->split(p1,p2,l-1); rt=merge(p1,p3); } } return 0; }