#include <bits/stdc++.h>   using namespace std;   const int N = 100010;   const int S = 550;   int n, q, a[N];   struct Block {     int lid, rid;     deque<int> que;     int mp[N];     Block() {}     void init() {       lid = rid = 0;       que.clear();       memset(mp, 0, sizeof mp);     }     void addf(int x) {       que.push_front(x);       mp[x]++;     }     void addb(int x) {       que.push_back(x);       mp[x]++;     }     void delf() {       if (que.empty()) return;       int x = que.front();       que.pop_front();       mp[x]--;     }     void delb() {       if (que.empty()) return;       int x = que.back();       que.pop_back();       mp[x]--;     }   } all[S];   int tot;   void init() {     for (int i = 0; i < S; ++i) all[i].init();     int id = 1;     tot = 0;     for (int i = 0; id <= n; ++i) {       tot++;       all[i].lid = all[i].rid = id;       for (int j = 1; j <= S && id <= n; ++j) {         all[i].addb(a[id]);         all[i].rid++;         id++;       }     }     for (int i = 0; i < tot; ++i) all[i].rid--;   }   int st[N], top;   void mov(int l, int r) {     int sx = 0, tx = 0;     for (int i = 0; i < tot; ++i) {       if (all[i].lid <= l && l <= all[i].rid) {         sx = i;       }       if (all[i].lid <= r && r <= all[i].rid) {         tx = i;       }     }     for (int i = sx + 1; i <= tx; ++i) {       all[i].addf(all[i - 1].que.back());       all[i - 1].delb();     }     int val = 0;     top = 0;     for (int i = all[tx].rid; i > r; --i) {       st[top++] = all[tx].que.back();       all[tx].delb();     }     val = all[tx].que.back();     all[tx].delb();     while (top > 0) all[tx].addb(st[--top]);     for (int i = all[sx].lid; i < l; ++i) {       st[top++] = all[sx].que.front();       all[sx].delf();     }     all[sx].addf(val);     while (top > 0) all[sx].addf(st[--top]);   }   int cal(int ip, int l, int r, int k) {     int res = 0;     top = 0;     for (int i = 1; i <= l - 1; ++i) {       st[top++] = all[ip].que.front();       all[ip].delf();     }     int alx = all[ip].rid - all[ip].lid + 1;     for (int i = 1; i <= alx - r; ++i) {       st[top++] = all[ip].que.back();       all[ip].delb();     }     res = all[ip].mp[k];     for (int i = 1; i <= alx - r; ++i) {       all[ip].addb(st[--top]);     }     for (int i = 1; i <= l - 1; ++i) {       all[ip].addf(st[--top]);     }     return res;   }   int qry(int l, int r, int k) {     int res = 0;     for (int i = 0; i < tot; ++i) {       if (all[i].lid <= l && r <= all[i].rid)         return cal(i, l - all[i].lid + 1, r - all[i].lid + 1, k);       if (l <= all[i].lid && all[i].rid <= r) res += all[i].mp[k];       if (all[i].lid < l && l <= all[i].rid) {         res += cal(i, l - all[i].lid + 1, all[i].rid - all[i].lid + 1, k);       }       if (all[i].lid <= r && all[i].rid > r) {         res += cal(i, 1, r - all[i].lid + 1, k);       }     }     return res;   }   int scan() {     int res = 0;     char ch;     while ((ch = getchar()) && (ch !=     && ch !=   n ))       res = res * 10 + ch -  0 ;     return res;   }   int Run() {     n = scan();     for (int i = 1; i <= n; ++i) a[i] = scan();     init();     int lans = 0;     q = scan();     while (q--) {       int op, l, r;       op = scan(), l = scan(), r = scan();       l = (l + lans - 1) % n + 1;       r = (r + lans - 1) % n + 1;       if (l > r) swap(l, r);       if (op == 1) {         mov(l, r);       } else {         int k;         k = scan();         k = (k + lans - 1) % n + 1;         lans = qry(l, r, k);         printf( %d n , lans);       }     }     return 0;   }   int main() { return Run(); }