#include <bits/stdc++.h>   using namespace std;   struct Node {     long long l, r;     mutable long long val;     Node(long long l = 0, long long r = 0, long long v = 0)         : l(l), r(r), val(v) {}     bool operator<(const Node& rv) const { return l < rv.l; }   };   long long n, m;   set<Node> t;   long long a[100005];   long long seed;   long long vmax;   long long qpow(long long x, long long p, long long m) {     long long ans = 1;     long long base = x;     while (p) {       if (p & 1) ans = (ans * base) % m;       base = (base * base) % m;       p >>= 1;     }     return ans;   }   long long rnd() {     long long ans = seed;     seed = (seed * 7 + 13) % 1000000007;     return ans;   }   set<Node>::iterator split(long long p) {     set<Node>::iterator it = t.lower_bound(Node(p));     if (it != t.end() && it->l == p) {       return it;     }     --it;     long long l = it->l, r = it->r, val = it->val;     t.erase(it);     t.insert(Node(l, p - 1, val));     return t.insert(Node(p, r, val)).first;   }   void assign(long long l, long long r, long long v) {     set<Node>::iterator end = split(r + 1);     set<Node>::iterator begin = split(l);     t.erase(begin, end);     t.insert(Node(l, r, v));   }   void add(long long l, long long r, long long k) {     set<Node>::iterator end = split(r + 1);     set<Node>::iterator begin = split(l);     for (set<Node>::iterator it = begin; it != end; ++it) {       it->val += k;     }   }   long long kth(long long l, long long r, long long k) {     vector<pair<long long, long long> > v;     set<Node>::iterator end = split(r + 1);     set<Node>::iterator begin = split(l);     for (set<Node>::iterator it = begin; it != end; ++it) {       v.push_back(make_pair(it->val, it->r - it->l + 1));     }     sort(v.begin(), v.end());     for (long long i = 0; i < v.size(); ++i) {       k -= v[i].second;       if (k <= 0) return v[i].first;     }     return -1;   }   long long power(long long l, long long r, long long k, long long mod) {     set<Node>::iterator end = split(r + 1);     set<Node>::iterator begin = split(l);     long long ans = 0;     for (set<Node>::iterator it = begin; it != end; ++it) {       ans = (ans +              (((qpow(it->val % mod, k, mod) % mod) * (it->r - it->l + 1 % mod)) %               mod)) %             mod;     }     return ans % mod;   }   signed main() {     ios::sync_with_stdio(false);     cin >> n >> m >> seed >> vmax;     for (long long i = 1; i <= n; ++i) {       a[i] = (rnd() % vmax) + 1;       t.insert(Node(i, i, a[i]));     }     for (long long i = 1; i <= m; ++i) {       long long opt = (rnd() % 4) + 1, l = (rnd() % n) + 1, r = (rnd() % n) + 1,                 x, y;       if (l > r) swap(l, r);       if (opt == 3)         x = (rnd() % (r - l + 1)) + 1;       else         x = (rnd() % vmax) + 1;       if (opt == 4) y = (rnd() % vmax) + 1;       if (opt == 1) {         add(l, r, x);       } else if (opt == 2) {         assign(l, r, x);       } else if (opt == 3) {         cout << kth(l, r, x) << endl;       } else {         cout << power(l, r, x, y) << endl;       }     }     return 0;   }   