#include <bits/stdc++.h>   using namespace std;   map<long long, pair<long long, long long>> ChthollyTree;   map<long long, pair<long long, long long>>::iterator split(       long long p, map<long long, pair<long long, long long>>::iterator *pre) {     map<long long, pair<long long, long long>>::iterator pos =         ChthollyTree.lower_bound(p);     if (pos->first == p) return pos;     pos--;     if (pos->second.first < p) return ChthollyTree.end();     long long left = pos->first, right = pos->second.first;     long long value = pos->second.second;     if (pre && *pre == pos) {       ChthollyTree.erase(pos);       *pre = ChthollyTree.insert(make_pair(left, make_pair(p - 1, value))).first;     } else {       ChthollyTree.erase(pos);       ChthollyTree[left] = make_pair(p - 1, value);     }     return ChthollyTree.insert(make_pair(p, make_pair(right, value))).first;   }   void add(long long l, long long r, long long diff) {     map<long long, pair<long long, long long>>::iterator s = split(l, NULL),                                                          e = split(r + 1, &s);     while (s != e) {       s->second.second += diff;       s++;     }   }   void assign(long long l, long long r, long long x) {     map<long long, pair<long long, long long>>::iterator s = split(l, NULL),                                                          e = split(r + 1, &s);     map<long long, pair<long long, long long>>::iterator tmp;     while (s != e) {       tmp = s;       s++;       ChthollyTree.erase(tmp);     }     ChthollyTree[l] = make_pair(r, x);   }   long long kSmallest(long long l, long long r, long long k) {     map<long long, pair<long long, long long>>::iterator s = split(l, NULL),                                                          e = split(r + 1, &s);     vector<pair<long long, long long>> buff;     while (s != e) {       buff.push_back(make_pair(s->second.second, s->second.first - s->first + 1));       s++;     }     sort(buff.begin(), buff.end());     unsigned int length = buff.size();     for (unsigned int i = 0; i < length; i++) {       k -= buff[i].second;       if (k <= 0) return buff[i].first;     }     return -1;   }   long long fastPowMod(long long base, long long p, long long mod) {     long long ret = 1;     base %= mod;     do {       if (p & 1) ret = ret * base % mod;       base = base * base % mod;     } while (p >>= 1);     return ret;   }   long long intervalPowSum(long long l, long long r, long long p, long long mod) {     map<long long, pair<long long, long long>>::iterator s = split(l, NULL),                                                          e = split(r + 1, &s);     long long ret = 0;     while (s != e) {       ret = (ret + fastPowMod(s->second.second, p, mod) % mod *                        (s->second.first - s->first + 1)) %             mod;       s++;     }     return ret;   }   inline long long rnd(long long &seed) {     long long ret = seed;     seed = (seed * 7 + 13) % 1000000007;     return ret;   }   inline void swap(long long &a, long long &b) {     long long t = a;     a = b;     b = t;   }   int main(void) {     ios::sync_with_stdio(false);     cin.tie(NULL);     long long n, m, seed, v;     long long op, l, r, x, y;     cin >> n >> m >> seed >> v;     for (long long i = 1; i <= n; i++) {       ChthollyTree[i] = make_pair(i, rnd(seed) % v + 1);     }     for (long long i = 0; i < m; i++) {       op = rnd(seed) % 4 + 1;       l = rnd(seed) % n + 1;       r = rnd(seed) % n + 1;       if (l > r) swap(l, r);       if (op == 3)         x = (rnd(seed) % (r - l + 1)) + 1;       else         x = rnd(seed) % v + 1;       if (op == 4) y = rnd(seed) % v + 1;       switch (op) {         case 1:           add(l, r, x);           break;         case 2:           assign(l, r, x);           break;         case 3:           cout << kSmallest(l, r, x) <<   n ;           break;         case 4:           cout << intervalPowSum(l, r, x, y) <<   n ;           break;       }     }     return 0;   }