代码:
#include<ctime>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<algorithm>
#include<functional>
#include<numeric>
using namespace std;
const int N=5000100;
const int inf=2e9;
int n,m,a[N],key[N],val[N],ls[N],rs[N],sum[N],sz[N],lz[N],mark[N],root,cnt;
char op[114];
inline void pushup(register int x,register int v)
{
if(!x)
{
return;
}
sum[x]+=v;
val[x]+=v;
lz[x]+=v;
}
inline void pushdown(register int x)
{
if(!x)
{
return;
}
pushup(ls[x],lz[x]);
pushup(rs[x],lz[x]);
if(x&&mark[x])
{
mark[x]=0;
swap(ls[x],rs[x]);
if(ls[x])mark[ls[x]]^=1;
if(rs[x])mark[rs[x]]^=1;
}
lz[x]=0;
}
inline int add(register int x)
{
sz[++cnt]=1;
val[cnt]=sum[cnt]=x;
key[cnt]=rand();
return cnt;
}
inline void upd(register int x)
{
sz[x]=sz[ls[x]]+sz[rs[x]]+1;
sum[x]=val[x];
if(ls[x])
{
sum[x]=min(sum[x],sum[ls[x]]);
}
if(rs[x])
{
sum[x]=min(sum[x],sum[rs[x]]);
}
}
inline int merge(register int x,register int y)
{
if(!x||!y)
{
return x|y;
}
if(key[x]<key[y])
{
pushdown(x);
rs[x]=merge(rs[x],y);
upd(x);
return x;
}
else
{
pushdown(y);
ls[y]=merge(x,ls[y]);
upd(y);
return y;
}
}
inline void split(register int now,register int k,register int &x,register int &y)
{
if(!now)
{
x=y=0;
return;
}
pushdown(now);
if(sz[ls[now]]>=k)
{
y=now;
split(ls[now],k,x,ls[now]);
}
else
{
x=now;
split(rs[now],k-sz[ls[now]]-1,rs[now],y);
}
upd(now);
}
inline int read(){
char ch;
register int s=0,x=1;
ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')x=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=(s<<3)+(s<<1)+(ch^48);
ch=getchar();
}
return s*x;
}
int main()
{
srand(114514);
// std::ios::sync_with_stdio(false);
n=read();
for(register int i=1;i<=n;i++)
{
a[i]=read();
root=merge(root,add(a[i]));
}
m=read();
// cout<<m<<endl;
while(m--)
{
scanf("%s",op);
// cout<<op<<endl;
if(op[0]=='M')
{
// puts("HUIUX");
register int l,r;
l=read(),r=read();
register int a,b,c,d;
split(root,r,a,b);
split(a,l-1,c,d);
printf("%d\n",sum[d]);
root=merge(merge(c,d),b);
}
else if(op[0]=='A')
{
register int l,r,k;
l=read(),r=read(),k=read();
register int a,b,c,d;
split(root,r,a,b);
split(a,l-1,c,d);
pushup(d,k);
root=merge(merge(c,d),b);
}
else if(op[0]=='I')
{
register int x,p;
x=read(),p=read();
int a,b;
split(root,x,a,b);
a=merge(a,add(p));
root=merge(a,b);
}
else if(op[0]=='D')
{
register int x;
x=read();
register int a,b,c,d;
split(root,x,a,b);
split(a,x-1,c,d);
d=merge(ls[d],rs[d]);
root=merge(merge(c,d),b);
}
else if(op[3]=='E')
{
// puts("cc");
register int l,r;
l=read(),r=read();
register int a,b,c,d;
split(root,r,a,b);
split(a,l-1,c,d);
mark[d]^=1;
root=merge(merge(c,d),b);
}
else
{
register int l,r,t;
l=read(),r=read(),t=read();
register int len=r-l+1;
t%=len;
if(!t)
{
continue;
}
register int x,y,z,a,b;
split(root,l-1,x,y);
split(y,r-l+1,y,z);
split(y,len-t,a,b);
y=merge(b,a);
root=merge(merge(x,y),z);
}
}
return 0;
}
/*
in #1
6
1 2 3 4 5 6
6
MIN 3 5
REVOLVE 2 5 2
MIN 3 6
DELETE 1
INSERT 1 2
MIN 1 3
out #1
3
2
2
in #2
8
1 2 3 4 5 6 7 8
8
REVOLVE 2 5 2
REVERSE 2 7
MIN 3 6
DELETE 1
INSERT 1 2
MIN 1 3
ADD 2 2 114
MIN 1 3
out #2
2
2
6
*/