#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&& ch<='9') {
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
const int maxn = 5e5 + 10;
int a[maxn],tag[maxn*4],n,m;
struct node{
int l,r,ans;
}tree[maxn*4];
inline node merge(node a,node b){
return (node){
a.l==0 ? b.l : a.l,
b.r==0 ? a.r : b.r,
a.ans+b.ans-(a.r==b.l)};
}
inline void pushdown(int x){
if (!tag[x]) return ;
tree[x*2].l=tree[x*2].r=tag[x*2]=tree[x*2].l=tree[x*2+1].r=tag[x*2+1]=tag[x];
tree[x*2].ans=tree[x*2+1].ans=1;
tag[x]=0;
}
inline void pushup(int x){
tree[x].l=tree[x*2].l;
tree[x].r=tree[2*x+1].r;
tree[x].ans=tree[x*2].ans+tree[x*2+1].ans-(tree[x*2].r==tree[x*2+1].l ? 1 : 0);
}
inline void reset(int x,int l,int r){
tree[x].l=tree[x].r=a[l],tree[x].ans=1;
}
void build(int l=1,int r=n,int x=1){
if(l==r){
reset(x,l,r);
return ;
}
int mid=(l+r)>>1;
build(l,mid,x*2);
build(mid+1,r,x*2+1);
pushup(x);
}
void update(int l,int r,int d,int cl=1,int cr=n,int x=1){
if (l<=cl && cr<=r){
tree[x].l=tree[x].r=tag[x]=d;
tree[x].ans=1;
return ;
}
int mid=(cl+cr)>>1;
pushdown(x);
if(l<=mid) update(l,r,d,cl,mid,x*2);
if(r>=mid+1) update(l,r,d,mid+1,cr,x*2+1);
pushup(x);
}
node query(int x,int l,int r,int cl=1,int cr=n){
if(l<=cl && cr<=r){
return tree[x];
}
int mid=(cl+cr)>>1;
pushdown(x);
node left={0,0,0},right={0,0,0};
if(l<=mid){
left = query(x*2,l,r,cl,mid);
}
if(r>=mid+1){
right = query(x*2+1,l,r,mid+1,cr);
}
return merge(left,right);
}
int x,y;
int turn(int s){
if(x){
s=y-s+2;
}
else{
s=s-y;
}
s = (s%n+n)%n;
s = (!s) ? n : s;
return s;
}
int q;
signed main() {
n=read(),m=read();
for (int i=1;i<=n;i++){
a[i]=read();
}
build();
q=read();
while (q--){
string s;
cin >> s;
if(s=="R"){
int k=read();
y=(y+k)%n;
}
else if(s=="F"){
x^=1;
y=(n-y+n)%n;
}
else if(s=="S"){
int l=read(),r=read();
int tl=turn(l);
int tr=turn(r);
int cl=query(1,tl,tl).l;
int cr=query(1,tr,tr).l;
if(cl!=cr){
update(tl,tl,cr),update(tr,tr,cl);
}
}
else if(s=="P"){
int l=read(),r=read(),k=read();
int nl=turn(l);
int nr=turn(r);
if(x){
swap(nl,nr);
}
if(nl<=nr){
update(nl,nr,k);
}
else {
update(nl,n,k),update(1,nr,k);
}
}
else if(s=="CS"){
int l=read(),r=read();
int tl=turn(l);
int tr=turn(r);
if(x) swap(tl,tr);
int ans=0;
if(tl<=tr){
ans=query(1,tl,tr).ans;
}
else{
ans=query(1,tl,n).ans+query(1,1,tr).ans;
ans-=(tree[1].l==tree[1].r);
}
cout << ans << "\n";
}
else{
cout << max(tree[1].ans-(tree[1].l==tree[1].r),1ll) << "\n";
}
}
return 0;
}