func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 100000 + 10;   const long long mod = 1000000000 + 7;   struct node {     int l, r;     mutable long long v;     node(int L, int R = -1, long long v = 0) : l(L), r(R), v(v){};     bool operator<(const node &x) const { return l < x.l; }   };   long long quick(long long a, long long n, long long p) {     a %= p;     long long ans = 1;     while (n) {       if (n & 1) ans = ans * a % p;       a = a * a % p;       n >>= 1;     }     return ans;   }   set<node> s;   set<node>::iterator spilt(int pos) {     set<node>::iterator it = s.lower_bound(node(pos));     if (it != s.end() && it->l == pos) return it;     it--;     int R = it->r, L = it->l;     long long V = it->v;     s.erase(it);     s.insert(node(L, pos - 1, V));     return s.insert(node(pos, R, V)).first;   }   void assign_val(int l, int r, long long val) {     set<node>::iterator itr = spilt(r + 1), itl = spilt(l);     s.erase(itl, itr);     s.insert(node(l, r, val));   }   void add(int l, int r, long long val) {     set<node>::iterator itr = spilt(r + 1), itl = spilt(l);     for (; itl != itr; itl++) itl->v += val;   }   long long ranks(int l, int r, int k) {     vector<pair<long long, int> > vp;     set<node>::iterator itr = spilt(r + 1), itl = spilt(l);     for (; itl != itr; itl++) {       vp.push_back({itl->v, itl->r - itl->l + 1});     }     sort(vp.begin(), vp.end());     for (int i = 0; i < vp.size(); i++) {       k -= vp[i].second;       if (k <= 0) return vp[i].first;     }   }   long long sum(int l, int r, int ex, long long p) {     set<node>::iterator itr = spilt(r + 1), itl = spilt(l);     long long ret = 0;     for (; itl != itr; itl++) {       ret += 1ll * (itl->r - itl->l + 1) * quick(itl->v, ex, p) % p;       ret %= p;     }     return ret;   }   int n, m;   long long seed, vmax, a[maxn];   long long rnd() {     long long ret = seed;     seed = (seed * 7 + 13) % mod;     return ret;   }   int main() {     cin >> n >> m >> seed >> vmax;     for (int i = 1; i <= n; i++) {       a[i] = (rnd() % vmax) + 1;       s.insert(node(i, i, a[i]));     }     s.insert(node(n + 1, n + 1, 0));     int x, y;     for (int i = 1; i <= m; i++) {       int op = int(rnd() % 4) + 1;       int l = int(rnd() % n) + 1;       int r = int(rnd() % n) + 1;       if (l > r) swap(l, r);       if (op == 3)         x = int(rnd() % (r - l + 1)) + 1;       else         x = int(rnd() % vmax) + 1;       if (op == 4) y = int(rnd() % vmax) + 1;       if (op == 1)         add(l, r, x);       else if (op == 2)         assign_val(l, r, x);       else if (op == 3)         cout << ranks(l, r, x) << endl;       else         cout << sum(l, r, x, y) << endl;     }     return 0;   }   