试了在各种地方 assert 也没找到
#pragma GCC optimize(3)
#pragma comment(linker,"/stack:200000000")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("-fdelete-null-pointer-checks,inline-functions-called-once,-funsafe-loop-optimizations,-fexpensive-optimizations,-foptimize-sibling-calls,-ftree-switch-conversion,-finline-small-functions,inline-small-functions,-frerun-cse-after-loop,-fhoist-adjacent-loads,-findirect-inlining,-freorder-functions,no-stack-protector,-fpartial-inlining,-fsched-interblock,-fcse-follow-jumps,-fcse-skip-blocks,-falign-functions,-fstrict-overflow,-fstrict-aliasing,-fschedule-insns2,-ftree-tail-merge,inline-functions,-fschedule-insns,-freorder-blocks,-fwhole-program,-funroll-loops,-fthread-jumps,-fcrossjumping,-fcaller-saves,-fdevirtualize,-falign-labels,-falign-loops,-falign-jumps,unroll-loops,-fsched-spec,-ffast-math,Ofast,inline,-fgcse,-fgcse-lm,-fipa-sra,-ftree-pre,-ftree-vrp,-fpeephole2",3)
#include<bits/stdc++.h>
#define psbk push_back
#define fst first
#define scd second
#define umap unordered_map
#define pqueue priority_queue
#define vc vector
#define all(v) v.begin(), v.end()
#define mem(a, x) memset(a, x, sizeof a)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
constexpr int inf = 0x3f3f3f3f;
namespace Fread{
const long long SIZE=1<<21;
char buf[SIZE],*S,*T;
inline char getchar(){
if (S==T){
T=(S=buf)+fread(buf,1,SIZE,stdin);
if(S==T){
return '\n';
}
}
return *S++;
}
}
namespace Fwrite{
const long long SIZE=1<<21;
char buf[SIZE],*S=buf,*T=buf+SIZE;
inline void flush(){
fwrite(buf,1,S-buf,stdout);
S=buf;
}
inline void putchar(char c){
*S++=c;
if(S==T){
flush();
}
}
struct NTR{
~NTR(){
flush();
}
}ztr;
}
#ifdef ONLINE_JUDGE
#define getchar Fread::getchar
#define putchar Fwrite::putchar
#endif
namespace Fastio{
struct Reader{
template<typename T>
Reader& operator>>(T& x){
char c=getchar();
T f=1;
while (c<'0'||c>'9'){
if (c=='-') f=-1;
c=getchar();
}
x=0;
while (c>='0'&&c<='9'){
x=x*10+(c-'0');
c=getchar();
}
x*=f;
return *this;
}
Reader& operator>>(char& c){
c=getchar();
while (c==' '||c=='\n'){
c=getchar();
}
return *this;
}
Reader& operator>>(char* str){
long long len=0;
char c=getchar();
while (c==' '||c=='\n'){
c=getchar();
}
while (c!=' '&&c!='\n'&&c!='\r'){
str[len++]=c;
c=getchar();
}
str[len]='\0';
return *this;
}
Reader(){}
}cin;
const char endl='\n';
struct Writer{
template<typename T>
Writer&operator<<(T x){
if(x==0){
putchar('0');
return *this;
}
if(x<0){
putchar('-');
x=-x;
}
static long long sta[45];
long long top=0;
while(x){
sta[++top]=x%10;
x/=10;
}
while(top){
putchar(sta[top]+'0');
--top;
}
return *this;
}
Writer& operator<<(char c){
putchar(c);
return *this;
}
Writer& operator<<(char* str){
long long cur=0;
while(str[cur]){
putchar(str[cur++]);
}
return *this;
}
Writer& operator<<(const char* str){
long long cur=0;
while(str[cur]){
putchar(str[cur++]);
}
return *this;
}
Writer(){}
}cout;
}
#define cin Fastio::cin
#define cout Fastio::cout
#define endl Fastio::endl
int n, a[100005], q, lstans, B, bel[100005], cnt[320][100005], bg[320];
deque<int> v[320];
signed main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
cin >> n;
B = sqrt(n) + 1;
for(int i=1;i<=n;i++)
{
cin >> a[i];
bel[i] = (i + B - 1) / B;
cnt[bel[i]][a[i]]++;
if(bel[i] != bel[i - 1])
{
bg[bel[i]] = i;
}
v[bel[i]].psbk(a[i]);
}
cin >> q;
while(q--)
{
int op, l, r, k;
cin >> op >> l >> r;
l = (l + lstans - 1 + n) % n + 1;
r = (r + lstans - 1 + n) % n + 1;
if(l > r)
{
swap(l, r);
}
if(op == 1)
{
if(bel[l] == bel[r])
{
int blk = bel[l];
l -= bg[blk], r -= bg[blk];
int rec = v[blk][r];
v[blk].erase(v[blk].begin() + r);
v[blk].insert(v[blk].begin() + l, rec);
}
else
{
int bl = bel[l], br = bel[r];
for(int i=bl;i<br;i++)
{
int tmp = v[i].back();
++cnt[i + 1][tmp];
v[i + 1].push_front(tmp);
--cnt[i][tmp];
v[i].pop_back();
}
int pos = r - bg[br] + 1;
int tmp = v[br][pos];
++cnt[bl][tmp];
v[bl].insert(v[bl].begin() + l - bg[bl], tmp);
--cnt[br][tmp];
v[br].erase(v[br].begin() + pos);
}
}
else
{
cin >> k;
k = (k + lstans - 1 + n) % n + 1;
if(bel[l] == bel[r])
{
int blk = bel[l];
l -= bg[blk], r -= bg[blk];
lstans = 0;
for(int i=l;i<=r;++i)
{
lstans += (v[blk][i] == k);
}
}
else
{
int bl = bel[l], br = bel[r];
lstans = 0;
for(int i=l-bg[bl];i<v[bl].size();++i)
{
lstans += (v[bl][i] == k);
}
for(int i=bl+1;i<br;++i)
{
lstans += cnt[i][k];
}
for(int i=0;i<=r-bg[br];++i)
{
lstans += (v[br][i] == k);
}
}
cout << lstans << endl;
}
}
return 0;
}