#include <bits/stdc++.h>   using namespace std;   const int S = 100003;   int n, a[S], f[353][S], nn, bl[S], fr[353], to[353], m, bg[353], ed[353],       las = 0;   deque<int> q[353];   void read(int &s) {     s = 0;     char c = getchar(), t = 1;     while (c !=  -  && (c <  0  || c >  9 )) c = getchar();     if (c ==  - ) c = getchar(), t = -1;     while (c >=  0  && c <=  9 )       s = (s << 1) + (s << 3) + (c ^ 48), c = getchar();     s *= t;   }   char colp = 0;   int main() {     read(n);     nn = sqrt(n);     colp =  a ;     for (int i = 1; i <= n; ++i) read(a[i]);     for (int i = 1; i <= n; ++i) bl[i] = (i - 1) / nn + 1;     for (int i = 1; i <= n; ++i) {       if (bl[i] != bl[i - 1]) fr[bl[i]] = i;       q[bl[i]].push_back(a[i]);       ++f[bl[i]][a[i]];       if (bl[i] != bl[i + 1]) to[bl[i]] = i;     }     read(m);     int op, l, r, k;     while (m--) {       read(op);       read(l);       read(r);       l = (l + las - 1) % n + 1;       r = (r + las - 1) % n + 1;       if (l > r) l ^= r ^= l ^= r;       if (op == 1) {         bg[0] = ed[0] = 0;         while (!q[bl[l]].empty())           bg[++bg[0]] = q[bl[l]].front(), q[bl[l]].pop_front();         int l1 = l - fr[bl[l]] + 1, l2 = r - fr[bl[r]] + 1;         if (bl[l] == bl[r]) {           for (int i = 1; i < l1; ++i) q[bl[l]].push_back(bg[i]);           q[bl[l]].push_back(bg[l2]);           for (int i = l1; i < l2; ++i) q[bl[l]].push_back(bg[i]);           for (int i = l2 + 1; i <= bg[0]; ++i) q[bl[l]].push_back(bg[i]);         } else {           while (!q[bl[r]].empty())             ed[++ed[0]] = q[bl[r]].front(), q[bl[r]].pop_front();           q[bl[l] + 1].push_front(bg[bg[0]]);           ++f[bl[l] + 1][bg[bg[0]]];           --f[bl[l]][bg[bg[0]]];           for (int i = bl[l] + 1; i < bl[r]; ++i) {             int o = q[i].back();             q[i + 1].push_front(o);             ++f[i + 1][o];             q[i].pop_back();             --f[i][o];           }           for (int i = 1; i < l2; ++i) q[bl[r]].push_back(ed[i]);           for (int i = l2 + 1; i <= ed[0]; ++i) q[bl[r]].push_back(ed[i]);           for (int i = 1; i < l1; ++i) q[bl[l]].push_back(bg[i]);           q[bl[l]].push_back(ed[l2]);           --f[bl[r]][ed[l2]];           ++f[bl[l]][ed[l2]];           for (int i = l1; i < bg[0]; ++i) q[bl[l]].push_back(bg[i]);         }       } else {         read(k);         k = (k + las - 1) % n + 1;         bg[0] = ed[0] = 0;         while (!q[bl[l]].empty())           bg[++bg[0]] = q[bl[l]].front(), q[bl[l]].pop_front();         int l1 = l - fr[bl[l]] + 1, l2 = r - fr[bl[r]] + 1;         if (bl[l] == bl[r]) {           int o = 0;           for (int i = l1; i <= l2; ++i)             if (bg[i] == k) ++o;           printf( %d n , las = o);         } else {           int o = 0;           while (!q[bl[r]].empty())             ed[++ed[0]] = q[bl[r]].front(), q[bl[r]].pop_front();           for (int i = bl[l] + 1; i < bl[r]; ++i) o += f[i][k];           for (int i = l1; i <= bg[0]; ++i)             if (bg[i] == k) ++o;           for (int i = 1; i <= l2; ++i)             if (ed[i] == k) ++o;           for (int i = 1; i <= ed[0]; ++i) q[bl[r]].push_back(ed[i]);           printf( %d n , las = o);         }         for (int i = 1; i <= bg[0]; ++i) q[bl[l]].push_back(bg[i]);       }     }     return 0;   }