#include <bits/stdc++.h>   using namespace std;   const int NIL = -1;   template <class T>   inline T mx(T a, T b) {     return a > b ? a : b;   }   template <class T>   inline T mi(T a, T b) {     return a < b ? a : b;   }   template <class T>   inline void sw(T &a, T &b) {     T t = a;     a = b;     b = t;   }   template <class T>   inline T mabs(T x) {     return x < 0 ? -x : x;   }   inline char gc() {     char ret;     while ((ret = getchar()) ==     || ret ==   n  || ret ==   t )       ;     return ret;   }   template <class T>   inline T sq(T x) {     return x * x;   }   const int LIM = 1e5 + 10;   long long n, m, seed, vmax;   map<long long, long long> ct;   inline map<long long, long long>::iterator split(long long p) {     map<long long, long long>::iterator ret = --ct.upper_bound(p);     if (ret->first != p) ct[p] = ret->second, ret++;     return ret;   }   inline void add(long long l, long long r, long long diff) {     map<long long, long long>::iterator s = split(l), e = split(r + 1);     while (s != e) (s++)->second += diff;   }   inline void assign(long long l, long long r, long long x) {     map<long long, long long>::iterator s = split(l), e = split(r + 1);     while (s != e) ct.erase(s++);     ct[l] = x;   }   vector<pair<long long, long long> > buff;   inline long long kSmallest(long long l, long long r, long long k) {     map<long long, long long>::iterator s = split(l), e = split(r + 1);     buff.clear();     while (s != e) {       r = (e--)->first;       buff.push_back(make_pair(e->second, r - e->first));     }     sort(buff.begin(), buff.end());     for (int i = 0; i < buff.size(); i++)       if ((k -= buff[i].second) <= 0) return buff[i].first;     return -1;   }   inline long long fp(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;   }   inline long long powSum(long long l, long long r, long long p, long long mod) {     map<long long, long long>::iterator s = split(l), e = split(r + 1);     long long ret = 0;     while (s != e) {       r = (e--)->first;       ret = (ret + (r - e->first) * fp(e->second, p, mod)) % mod;     }     return ret % mod;   }   inline long long rnd() {     long long ret = seed;     seed = (seed * 7 + 13) % 1000000007;     return ret;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(NULL), cout.tie(NULL);     cin >> n >> m >> seed >> vmax;     long long x, y;     for (int i = 1; i <= n; i++) ct[i] = (rnd() % vmax) + 1;     for (int i = 1; i <= m; i++) {       long long op = (rnd() % 4) + 1;       long long l = (rnd() % n) + 1;       long long r = (rnd() % n) + 1;       if (l > r) sw(l, r);       if (op == 3)         x = (rnd() % (r - l + 1)) + 1;       else         x = (rnd() % vmax) + 1;       if (op == 4) y = (rnd() % vmax) + 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 << powSum(l, r, x, y) <<   n ;           break;       }     }     return 0;   }