#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <assert.h>
using namespace std;
#define N 100020
#define M 100200
#define eps 1e-12
#define inf 0x3f3f3f3f
#define mod 110119
#define LL long long
#define ls (i << 1)
#define rs (ls | 1)
#define md (ll + rr >> 1)
#define lson ll, md, ls
#define rson md + 1, rr, rs
#define MP make_pair
#define pii pair<int, int>
#define ui unsigned int
#define fi first
#define se second
#define pll pair<LL, LL>
#define pdi pair<double, int>
struct node {
#define K 400
int q[K];
int qh, qt;
void add(int v) {
--qh;
if(qh < 0) qh = K - 1;
q[qh] = v;
}
void add_tail(int v) {
q[qt++] = v;
if(qt >= K) qt = 0;
}
void del() {
--qt;
if(qt < 0) qt = K - 1;
}
void change(int l, int r) {
int s = (qh + l) % K, t = (qh + r) % K;
int v = q[t];
for(int i = t; i != s;) {
int j = i - 1;
if(j < 0) j += K;
q[i] = q[j];
i = j;
}
q[s] = v;
}
int get_tail() {
int v = qt - 1;
if(v < 0) v += K;
return q[v];
}
int get_head() {
return q[qh];
}
int get_k(int k) {
int v = (qh + k) % K;
return q[v];
}
void set_k(int k, int v) {
int p = (qh + k) % K;
q[p] = v;
}
}p[N / 400];
int B;
int n, a[N];
int cnt[N / 400][N];
int main() {
scanf("%d", &n);
B = 400;
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
p[i / B].add_tail(a[i]);
cnt[i / B][a[i]]++;
}
int q;
int ans = 0;
scanf("%d", &q);
while(q--) {
int op, l, r, k;
scanf("%d%d%d", &op, &l, &r);
if(op == 2) scanf("%d", &k);
l = (l + ans - 1) % n + 1;
r = (r + ans - 1) % n + 1;
k = (k + ans - 1) % n + 1;
if(l > r) swap(l, r);
--l, --r;
int u = l / B, v = r / B;
if(op == 1) {
if(u == v) p[u].change(l % B, r % B);
else {
int pre = p[u].get_tail();
cnt[u][pre]--;
for(int i = u + 1; i < v; ++i) {
cnt[i][pre]++;
int x = p[i].get_tail();
cnt[i][x]--;
p[i].del();
p[i].add(pre);
pre = x;
}
int x = p[v].get_k(r % B);
p[v].change(0, r % B);
p[v].set_k(0, pre);
cnt[v][x]--;
cnt[v][pre]++;
cnt[u][x]++;
p[u].change(l % B, B - 1);
p[u].set_k(l % B, x);
}
}
else {
ans = 0;
for(int i = u + 1; i < v; ++i) ans += cnt[i][k];
if(u == v) {
for(int i = l % B; i <= r % B; ++i) {
ans += p[u].get_k(i) == k;
}
}
else {
for(int i = l % B; i <= B - 1; ++i) {
ans += p[u].get_k(i) == k;
}
for(int i = 0; i <= r % B; ++i) {
ans += p[v].get_k(i) == k;
}
}
printf("%d\n", ans);
}
}
return 0;
}