一个支持区间翻转,区间平移的伸展树
为了一个小错误调了$n$久,$t[++cnt].d=t[cnt].ms=d$....真想打自己一拳

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define gc getchar()
#define ll long long 
using namespace std;
const int N=2e5+10;
const ll inf=0x3f3f3f3f3f3f3f;
template<class o>
inline void qr(o &x)
{
    char c=gc;int f=1;x=0;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
    x*=f;
}
void qw(ll x)
{
    if(x<0)x=-x,putchar('-');
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
struct node{int f,son[2],c;ll ad,d,ms;bool rv;node(){ms=inf;}}t[N];int root,cnt;
inline void update(int p)
{
    t[p].c=1+t[t[p].son[0]].c+t[t[p].son[1]].c;
    t[p].ms=min(t[t[p].son[0]].ms,min(t[p].d,t[t[p].son[1]].ms));
}
inline void crv(int p) 
{
    if(!p)return ;
    swap(t[p].son[0],t[p].son[1]);t[p].rv^=1;
}
inline void cad(int p,ll ad)
{
    if(!p)return ;
    t[p].ad+=ad;t[p].d+=ad;t[p].ms+=ad;
}
void pushdown(int p)
{ 
    if(t[p].ad)
    {
        cad(t[p].son[0],t[p].ad);
        cad(t[p].son[1],t[p].ad);
        t[p].ad=0;
    }
    if(t[p].rv)
    {
        crv(t[p].son[0]);crv(t[p].son[1]);
        t[p].rv=0;
    }
} 
void rotate(int p,int w)
{
    int f=t[p].f,gf=t[f].f;
    int r=t[p].son[w],R=f;t[R].son[w^1]=r;if(r)t[r].f=R;
    r=p;R=gf;t[R].son[t[R].son[1]==f]=r;t[r].f=R;
    r=f;R=p;t[R].son[w]=r;t[r].f=R;update(f),update(p);
}
void splay(int p,int rt)
{
    while(t[p].f!=rt)
    {
        int f=t[p].f,gf=t[f].f;
        if(gf==rt)rotate(p,t[f].son[0]==p);
        else
        {
            if(t[f].son[0]==p&&t[gf].son[0]==f)rotate(f,1),rotate(p,1);
            else if(t[f].son[1]==p&&t[gf].son[0]==f)rotate(p,0),rotate(p,1);
            else if(t[f].son[0]==p&&t[gf].son[1]==f)rotate(p,1),rotate(p,0);
            else rotate(f,0),rotate(p,0);
        }
    }
    if(!rt)root=p;
}
ll a[N];
void build(int &p,int f,int l,int r)
{
    if(l>r){p=0;return ;}
    int mid=l+r>>1;
    p=mid;t[p].d=t[p].ms=a[mid];t[p].c=1;t[p].f=f;
    build(t[p].son[0],p,l,mid-1);
    build(t[p].son[1],p,mid+1,r);
    update(p);
}
inline int kth(int k)
{
    int p=root;
    while(233)
    {
        pushdown(p);
        int lc=t[p].son[0],rc=t[p].son[1];
        if(t[lc].c>=k)p=lc;
        else if(t[lc].c+1<k)k-=t[lc].c+1,p=rc;
        else break;
    }
    return p;
}
int split(int l,int r)
{
    l=kth(l),r=kth(r);splay(l,0),splay(r,l);
    return r;
}
void ins(int p)
{
    ll d;qr(d);
    int f=split(p+1,p+2);
    ++cnt;t[cnt].d=t[cnt].ms=d;
    t[cnt].c=1;t[cnt].f=f;
    t[f].son[0]=cnt;update(f);update(t[f].f);//要更新完。 
}
void del(int p)
{
    int f=split(p,p+2);
    t[f].son[0]=0;update(f),update(t[f].f);
}
void add(int l,int r)
{
    ll ad;qr(ad);
    int f=split(l,r+2);
    cad(t[f].son[0],ad);
    update(f),update(t[f].f);   
}
void reve(int l,int r)
{
    int f=split(l,r+2);
    crv(t[f].son[0]);
}
void revol(int l1,int r1,int l2,int r2)
{
    int f=split(l2,r2+2);
    int p=t[f].son[0];t[f].son[0]=0;
    f=split(l1,l1+1);t[f].son[0]=p;t[p].f=f;
    update(f),update(t[f].f);
    /*while(233)
    {
        pushdown(p);
        int lc=t[p].son[0],rc=t[p].son[1];
        if(t[lc].c>=k)p=lc;
        else if(t[lc].c+1<k)k-=t[lc].c+1,p=rc;
        else break;
    }
    splay(p,f);
    int R=p;
    while(t[R].son[1])pushdown(R),R=t[R].son[1];
    if(R!=p)splay(R,p);t[R].son[1]=t[p].son[0];t[t[p].son[0]].f=R;t[p].son[0]=0;
    update(R),update(p),update(f),update(t[f].f);*/
}
void query(int l,int r)
{
    int f=split(l,r+2);
    qw(t[t[f].son[0]].ms);puts("");
}
int n;
void pri(int p)
{
    if(!p)return ;
    pushdown(p);
    if(t[p].son[0])pri(t[p].son[0]);
    if(p!=1&&p!=n+2)qw(t[p].d),putchar(' ');
    if(t[p].son[1])pri(t[p].son[1]);
}
int main()
{
    //freopen("d3.in","r",stdin);
    //freopen("a.out","w",stdout);
    qr(n);t[0].ms=a[1]=a[n+2]=inf;
    for(int i=1;i<=n;i++)qr(a[i+1]);
    build(root,0,1,n+2);cnt=n+2;
    //pri(root);puts("");
    int m;qr(m);
    for(int i=1;i<=m;i++)
    {
        char op[15];int p,l,r,k;scanf("%s",op);
        if(op[0]=='A')qr(l),qr(r),add(l,r);
        else if(op[0]=='M')qr(l),qr(r),query(l,r);
        else if(op[0]=='I')qr(p),ins(p);
        else if(op[0]=='R'&&op[3]=='E')qr(l),qr(r),reve(l,r);
        else if(op[0]=='R'&&op[3]=='O')
        {
            qr(l),qr(r),qr(k);k=(k%(r-l+1)+r-l+1)%(r-l+1);
            if(k)revol(l,r-k,r-k+1,r);
        }
        else qr(p),del(p);
        //pri(root);puts("");
    }
    return 0;
}
/*
6
92165
98761
19787
55146
86540
66857
11
DELETE 1
REVOLVE 2 5 3
MIN 2 2
MIN 3 4
INSERT 2 90581
INSERT 6 89462
INSERT 6 99467
REVERSE 7 7
MIN 5 5
ADD 5 8 97750
REVOLVE 3 3 5235
 
*/