斗神_君莫笑 @ 2019-08-25 19:30:08
#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
struct Node{
int l,r,sum,lsum,rsum,lazy;
}T[2000010];
int a[500010];
inline void pushup(int p){
T[p].lsum=T[lc].lsum;
T[p].rsum=T[rc].rsum;
T[p].sum=T[lc].sum+T[rc].sum-(T[lc].rsum==T[rc].lsum);
}
void build(int p,int l,int r){
T[p].l=l;T[p].r=r;
if(l==r){
T[p].sum=1;
T[p].lsum=T[p].rsum=a[l];
return;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(p);
}
inline void pushnow(int p,int v){
T[p].sum=1;
T[p].lsum=T[p].rsum=v;
T[p].lazy=v;
}
void pushdown(int p){
if(T[p].lazy){
pushnow(lc,T[p].lazy);
pushnow(rc,T[p].lazy);
T[p].lazy=0;
}
}
void update(int p,int ql,int qr,int v){
if(ql<=T[p].l&&T[p].r<=qr){
pushnow(p,v);
return;
}
pushdown(p);
int mid=(T[p].l+T[p].r)>>1;
if(ql<=mid)update(lc,ql,qr,v);
if(qr>mid)update(rc,ql,qr,v);
pushup(p);
}
int query(int p,int ql,int qr){
if(ql<=T[p].l&&T[p].r<=qr)
return T[p].sum;
int mid=(T[p].l+T[p].r)>>1;
pushdown(p);
if(ql<=mid&&mid<qr)
return query(lc,ql,qr)+query(rc,ql,qr)-(T[lc].rsum==T[rc].lsum);
if(ql<=mid) return query(lc,ql,qr);
if(qr>mid) return query(rc,ql,qr);
}
int query_2(int p,int q){
if(T[p].l==T[p].r)return T[p].lsum;
int mid=(T[p].l+T[p].r)>>1;
pushdown(p);
if(q<=mid)return query_2(lc,q);
if(q>mid)return query_2(rc,q);
}
int n,m,move,turn;
int change(int k){
if(!turn)k=(k-move+n)%n;
else k=(n-k+move)%n;
if(k==0)k=n;
return k;
}
int main(){
freopen("11.in","r",stdin);
//freopen("1.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;++i)
a[i]=read();
build(1,1,n);
m=read();
for(int i=1;i<=m;++i){
char ch=getchar();
while(ch!='C'&&ch!='S'&&ch!='P'&&ch!='R'&&ch!='F')ch=getchar();
if(ch=='C'){
ch=getchar();
if(ch=='S'){
ch='0';
int l,r;
l=read();r=read();
l=change(l);r=change(r);
if(turn)swap(l,r);
//printf("%d %d\n",l,r);
if(r<l){
//printf("%d %d %d\n",query(1,l,n),query(1,1,r),(T[1].lsum==T[1].rsum));
printf("%d\n",query(1,l,n)+query(1,1,r)-(T[1].lsum==T[1].rsum));
}
else if((l==1&&r==n)||(l==r+1))
printf("%d\n",query(1,1,n)-(T[1].lsum==T[1].rsum));
else printf("%d\n",query(1,l,r));
}
else printf("%d\n",query(1,1,n)-(T[1].lsum==T[1].rsum));
}
if(ch=='F'){
turn^=1;
move=(n-move)%n;
}
if(ch=='R'){
int k;k=read();
if(turn)move=(move-k+n)%n;
else move=(move+k)%n;
}
if(ch=='S'){
int l,r;
l=read();r=read();
l=change(l);r=change(r);
if(turn)swap(l,r);
int color1=query_2(1,l);
int color2=query_2(1,r);
update(1,l,l,color2);
update(1,r,r,color1);
}
if(ch=='P'){
int l,r,k;
l=read();r=read();k=read();
l=change(l);r=change(r);
if(turn)swap(l,r);
if(r<l)update(1,l,n,k),update(1,1,r,k);
else update(1,l,r,k);
}
//printf("\nthe move is %d \n",move);
}
return 0;
}
sub2的时候总有几个输出少1……
边界又奇奇怪怪了
by 弹星者 @ 2019-08-25 19:33:11
性感萌新
by 吾皇 @ 2019-08-25 19:35:52
在线提问
by Wiene @ 2019-08-25 19:36:02
@斗神_君莫笑 去您的不是妹子
by ueettttuj @ 2019-08-25 19:37:06
by Smile_Cindy @ 2019-08-25 19:40:55
不是妹子不看
by Wiene @ 2019-08-25 19:43:34
@Alpha 她那么可耐,怎么可能不是妹子呢?qwq
by 斗神—君莫笑 @ 2019-08-25 19:46:44
@AC鸭 鸭鸭帮个忙嘛QAQ
by Wiene @ 2019-08-25 19:48:28
@斗神—君莫笑 内个,我太弱了,不会,打扰您了qwq
by Lstdo @ 2019-08-25 20:12:13
不是妹子啊,走了走了
by 斗神—君莫笑 @ 2019-08-25 20:15:05
@Lstdo lst!!!站住!