func_code_string: #include <bits/stdc++.h>   using namespace std;   long long read() {     long long f = 1, x = 0;     char ss = getchar();     while (ss <  0  || ss >  9 ) {       if (ss ==  - ) f = -1;       ss = getchar();     }     while (ss >=  0  && ss <=  9 ) {       x = x * 10 + ss -  0 ;       ss = getchar();     }     return f * x;   }   long long seed, vmax;   long long rnd() {     long long res = seed;     seed = (seed * 7 + 13) % 1000000007;     return res;   }   const int maxn = 100010;   int n, m;   long long a[maxn];   struct node {     int ll, rr;     mutable long long val;     bool operator<(const node& tt) const { return ll < tt.ll; }   };   set<node> st;   long long qpow(long long a, long long k, long long p) {     long long res = 1;     a %= p;     while (k > 0) {       if (k & 1) res = (res * a) % p;       a = (a * a) % p;       k >>= 1;     }     return res;   }   set<node>::iterator split(int pos) {     set<node>::iterator it = st.lower_bound(node{pos});     if (it != st.end() && it->ll == pos) return it;     --it;     int ll = it->ll, rr = it->rr;     long long val = it->val;     st.erase(it);     st.insert(node{ll, pos - 1, val});     return st.insert(node{pos, rr, val}).first;   }   void assign(int ll, int rr, long long val) {     set<node>::iterator itr = split(rr + 1), itl = split(ll);     st.erase(itl, itr);     st.insert(node{ll, rr, val});   }   void add(int ll, int rr, long long val) {     set<node>::iterator itr = split(rr + 1), itl = split(ll);     for (; itl != itr; ++itl) itl->val += val;   }   long long kth(int ll, int rr, int k) {     vector<pair<long long, int> > vec;     set<node>::iterator itr = split(rr + 1), itl = split(ll);     for (; itl != itr; ++itl)       vec.push_back(pair<long long, int>(itl->val, itl->rr - itl->ll + 1));     sort(vec.begin(), vec.end());     for (vector<pair<long long, int> >::iterator it = vec.begin();          it != vec.end(); ++it) {       k -= it->second;       if (k <= 0) return it->first;     }     return -1;   }   long long qsum(int ll, int rr, long long x, long long y) {     long long res = 0;     set<node>::iterator itr = split(rr + 1), itl = split(ll);     for (; itl != itr; ++itl)       res += (qpow(itl->val, x, y) * ((itl->rr - itl->ll + 1) % y)) % y, res %= y;     return res;   }   int main() {     n = read();     m = read();     seed = read();     vmax = read();     for (int i = 1; i <= n; ++i) {       a[i] = (rnd() % vmax) + 1;       st.insert(node{i, i, a[i]});     }     for (int i = 1; i <= m; ++i) {       int op = (rnd() % 4) + 1;       int ll = (rnd() % n) + 1, rr = (rnd() % n) + 1;       long long x, y;       if (ll > rr) swap(ll, rr);       if (op == 3)         x = (rnd() % (rr - ll + 1)) + 1;       else         x = (rnd() % vmax) + 1;       if (op == 4) y = (rnd() % vmax) + 1;       if (op == 1)         add(ll, rr, x);       else if (op == 2)         assign(ll, rr, x);       else if (op == 3)         printf( %lld n , kth(ll, rr, x));       else if (op == 4)         printf( %lld n , qsum(ll, rr, x, y));     }     return 0;   }   