#include <bits/stdc++.h>   using namespace std;   struct st {     deque<int> q;     int cnt[100004];     int use[100004];     int u_s = 0;     st() {       memset(cnt, 0, sizeof(cnt));       memset(use, 0, sizeof(use));       q.clear();     }     void push_back(int x) {       q.push_back(x);       if (use[x] != u_s) {         use[x] = u_s;         cnt[x] = 0;       }       cnt[x]++;     }     void erase(int i) {       cnt[q[i]]--;       q.erase(i + q.begin(), i + 1 + q.begin());     }     void insert(int i, int x) {       if (use[x] != u_s) {         use[x] = u_s;         cnt[x] = 0;       }       cnt[x]++;       q.insert(q.begin() + i, x);     }     void clear() {       q.clear();       u_s++;     }     int size() { return q.size(); }   };   st b[320];   int a[100004];   int unit;   int n;   int fi;   int bit[320];   int las = 0;   void add(int i, int x) {     i++;     while (i < 320) {       bit[i] += x;       i += i & -i;     }   }   int sum(int i) {     i++;     int r = 0;     while (i) {       r += bit[i];       i -= i & -i;     }     return r;   }   pair<int, int> belong(int i) {     int mint = 0;     int maxt = n / unit;     maxt++;     while (mint + 1 < maxt) {       int mid = (mint + maxt) >> 1;       if (sum(mid) >= i) {         maxt = mid;       } else {         mint = mid;       }     }     pair<int, int> r;     if (mint != maxt) {       if (sum(mint) >= i) {         r.first = mint;       } else {         r.first = maxt;       }     }     if (r.first == 0) {       r.second = i - 1;       return r;     } else {       r.second = i - sum(r.first - 1);       r.second--;       return r;     }     return r;   }   void re() {     memset(bit, 0, sizeof(bit));     int s = 0;     for (int i = 0; i <= (n) / unit; i++) {       for (int j = 0; j < b[i].size(); j++) {         a[s] = b[i].q[j];         s++;       }       b[i].clear();     }     for (int i = 0; i < n; i++) {       b[i / unit].push_back(a[i]);       add(i / unit, 1);     }   }   int main() {     scanf( %d , &n);     unit = sqrt(100004);     for (int i = 0; i < n; i++) {       scanf( %d , &a[i]);       b[i / unit].push_back(a[i]);       add(i / unit, 1);     }     int q;     scanf( %d , &q);     int q2 = 0;     int uni = sqrt(100004);     if (uni == 0) {       uni++;     }     uni = max(uni, unit);     int lastans = 0;     for (int i = 0; i < q; i++) {       if (i && (i % uni == 0)) {         re();       }       int ty;       scanf( %d , &ty);       if (ty == 1) {         int l, r;         scanf( %d%d , &l, &r);         l += lastans - 1;         l %= n;         l++;         r += lastans - 1;         r %= n;         r++;         if (l > r) {           swap(l, r);         }         if (l == r) {           continue;         }         pair<int, int> bb = belong(l);         pair<int, int> c = belong(r);         int val = b[c.first].q[c.second];         b[c.first].erase(c.second);         b[bb.first].insert(bb.second, val);         add(c.first, -1);         add(bb.first, 1);       } else {         int l, r, k;         scanf( %d%d%d , &l, &r, &k);         l += lastans - 1;         l %= n;         l++;         r += lastans - 1;         r %= n;         r++;         k += lastans - 1;         k %= n;         k++;         if (l > r) {           swap(l, r);         }         pair<int, int> c = belong(l);         pair<int, int> d = belong(r);         if (c.first == d.first) {           int ans = 0;           for (int j = c.second; j <= d.second; j++) {             if (b[c.first].q[j] == k) {               ans++;             }           }           lastans = ans;           printf( %d n , ans);           continue;         }         int ans = 0;         for (int j = c.second; j < b[c.first].q.size(); j++) {           if (b[c.first].q[j] == k) {             ans++;           }         }         for (int j = 0; j <= d.second; j++) {           if (b[d.first].q[j] == k) {             ans++;           }         }         for (int i = c.first + 1; i < d.first; i++) {           if (b[i].use[k] == b[i].u_s) {             ans += b[i].cnt[k];           }         }         printf( %d n , ans);         lastans = ans;       }     }     return 0;   }