func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5;   const int B = 350;   int a[N];   int b[N];   int tot = 0;   mt19937 rng(4112003);   struct Node {     Node *l, *r;     Node *p;     int key, pri;     int nCh, cnt[B];     Node(int x = 0) : key(x), pri(rng() << 16 | rng()), nCh(1) {       l = r = 0;       for (int i = 0; i < tot; ++i) cnt[i] = 0;       if (b[x] >= 0) cnt[b[x]] = 1;     };   } * p[N];   int Siz(Node *x) {     if (x)       return x->nCh;     else       return 0;   }   void pull(Node *x) {     Node *u = x->l;     Node *v = x->r;     x->nCh = 1;     x->nCh += Siz(u);     x->nCh += Siz(v);     for (int i = 0; i < tot; ++i) {       x->cnt[i] = 0;       if (u) x->cnt[i] += u->cnt[i];       if (v) x->cnt[i] += v->cnt[i];     }     if (b[x->key] >= 0) x->cnt[b[x->key]]++;     if (u) u->p = x;     if (v) v->p = x;   }   Node *join(Node *x, Node *y) {     if (!x) return y;     if (!y) return x;     if (x->pri > y->pri) {       x->r = join(x->r, y);       pull(x);       return x;     } else {       y->l = join(x, y->l);       pull(y);       return y;     }   }   void split(Node *x, Node *&l, Node *&r, int p) {     if (!x) {       l = r = 0;       return;     }     if (p >= Siz(x->l) + 1) {       p -= Siz(x->l) + 1;       split(x->r, x->r, r, p);       pull(l = x);     } else       split(x->l, l, x->l, p), pull(r = x);   }   vector<int> pos[N];   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     srand(time(NULL));     int n;     cin >> n;     for (int i = 0; i < n; ++i) {       int x;       cin >> x;       --x;       pos[x].emplace_back(i);       a[i] = x;     }     for (int i = 0; i < n; ++i) {       if (pos[i].size() > B)         b[i] = tot++;       else         b[i] = -1;     }     Node *R = 0;     for (int i = 0; i < n; ++i) R = join(R, p[i] = new Node(a[i]));     int q;     cin >> q;     int lst = 0;     for (int i = 0; i < q; ++i) {       int t;       cin >> t;       int l;       cin >> l;       l = (l + lst - 1) % n;       int r;       cin >> r;       r = (r + lst - 1) % n;       if (l > r) swap(l, r);       if (t == 1) {         Node *x, *y, *z;         split(R, R, x, l);         split(x, x, y, r - l + 1);         split(x, x, z, r - l);         x = join(z, x);         x = join(x, y);         R = join(R, x);       }       if (t == 2) {         int x;         cin >> x;         x = (x + lst - 1) % n;         lst = 0;         if (b[x] >= 0) {           Node *p, *q;           split(R, R, p, l);           split(p, p, q, r - l + 1);           lst = p->cnt[b[x]];           p = join(p, q);           R = join(R, p);         } else {           for (int a : pos[x]) {             Node *T = p[a];             int cur = Siz(T->l);             while (T != R) {               if (T->p->r == T) cur += Siz(T->p->l) + 1;               T = T->p;             }             if (cur < l) continue;             if (cur > r) continue;             lst++;           }         }         cout << lst <<   n ;       }     }   }   