RT,程序如下:
#include<bits/stdc++.h>
#define L(i, j, k) for(int i = j, i##E = k; i <= i##E; i++)
#define R(i, j, k) for(int i = j, i##E = k; i >= i##E; i--)
#define ll long long
#define ull unsigned long long
#define db long double
#define pii pair<int, int>
#define mkp make_pair
#define sz(x) ((int) x.size())
#define be(x) x.begin()
#define en(x) x.end()
using namespace std;
const int N = 1e5 + 7;
const int B = 320;
int n, m, a[N], lastans, cnt[N / B + 5][N], Bl[N], Br[N], id[N];
deque<int> q[N / B + 5];
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
L(i, 1, n) cin >> a[i];
L(i, 1, n) id[i] = (i - 1) / B + 1;
L(i, 1, id[n]) Bl[i] = (i - 1) * B + 1, Br[i] = min(i * B, n);
L(i, 1, n) q[id[i]].push_back(a[i]), cnt[id[i]][a[i]] ++;
cin >> m;
while(m--) {
int opt, l, r, k; cin >> opt >> l >> r;
l = (l + lastans - 1) % n + 1, r = (r + lastans - 1) % n + 1;
if(l > r) swap(l, r);
int idl = id[l], idr = id[r];
if(l < 0 || r < 0) exit(0);
if(opt == 2) {
cin >> k, k = (k + lastans - 1) % n + 1;
if(k < 0) exit(0);
int sum = 0;
if(idl == idr) L(i, l, r) sum += q[idl][i - Bl[idl]] == k;
else {
L(i, idl + 1, idr - 1) sum += cnt[i][k];
L(i, l, Br[idl]) sum += q[idl][i - Bl[idl]] == k;
L(i, Bl[idr], r) sum += q[idr][i - Bl[idr]] == k;
}
cout << (lastans = sum) << "\n";
}
else {
int v;
if(idl == idr)
v = q[idl][r - Bl[idl]], q[idl].erase(be(q[idl]) + r - Bl[idl]), q[idl].insert(be(q[idl]) + l - Bl[idl], v);
else {
for(int i = idl; i < idr; )
v = q[i].back(), cnt[i][v] --, q[i].pop_back(), i ++, q[i].push_front(v), cnt[i][v] ++;
v = q[idr][r - Bl[idr] + 1], cnt[idr][v] --, q[idr].erase(be(q[idr]) + r - Bl[idr] + 1);
if(l - Bl[idl] > sz(q[idl])) exit(0);
q[idl].insert(be(q[idl]) + l - Bl[idl], v), cnt[idl][v] ++;
}
}
}
return 0;
}