#include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 5;   int n, m, vmx;   long long seed;   struct node {     int l, r;     mutable long long val;     bool operator<(const node &x) const { return l < x.l; }   };   set<node> tr;   set<node>::iterator split(int pos) {     set<node>::iterator iter = tr.lower_bound((node){pos});     if (iter != tr.end() && iter->l == pos) return iter;     iter--;     int L = iter->l, R = iter->r;     long long Val = iter->val;     tr.erase(iter);     tr.insert((node){L, pos - 1, Val});     return tr.insert((node){pos, R, Val}).first;   }   void assign(int l, int r, long long val) {     set<node>::iterator R = split(r + 1), L = split(l);     tr.erase(L, R);     tr.insert((node){l, r, val});     return;   }   void add(int l, int r, long long val) {     set<node>::iterator R = split(r + 1), L = split(l);     for (; L != R; ++L) L->val = L->val + val;     return;   }   struct Lsh {     long long val;     int sum;   } ls[N];   inline bool Lscmp(Lsh a, Lsh b) { return a.val < b.val; }   inline long long rnk(int l, int r, int x) {     set<node>::iterator R = split(r + 1), L = split(l);     int tot = 0;     for (; L != R; ++L) ls[++tot].val = L->val, ls[tot].sum = (L->r - L->l + 1);     sort(ls + 1, ls + tot + 1, Lscmp);     for (int i = 1; i <= tot; i++) {       x -= ls[i].sum;       if (x <= 0) return ls[i].val;     }   }   inline long long ksm(long long a, long long b, long long mod) {     a %= mod;     long long ans = 1;     while (b) {       if (b & 1) ans = ans * a % mod;       a = a * a % mod;       b >>= 1;     }     return ans;   }   inline long long calc(int l, int r, int x, int y) {     set<node>::iterator R = split(r + 1), L = split(l);     long long ans = 0;     for (; L != R; ++L)       ans = (ans + ksm(L->val, x, y) * (L->r - L->l + 1) % y) % y;     return ans;   }   inline int rnd() {     int ret = seed;     seed = (seed * 7 + 13) % 1000000007;     return ret;   }   int op, l, r, x, y;   int tot;   int main() {     scanf( %d%d%lld%d , &n, &m, &seed, &vmx);     for (int i = 1; i <= n; i++) tr.insert((node){i, i, rnd() % vmx + 1});     tr.insert((node){n + 1, n + 1, 0});     for (int i = 1; i <= m; i++) {       op = rnd() % 4 + 1;       l = rnd() % n + 1;       r = rnd() % n + 1;       if (l > r) swap(l, r);       if (op == 3)         x = rnd() % (r - l + 1) + 1;       else         x = rnd() % vmx + 1;       if (op == 4) y = rnd() % vmx + 1;       if (op == 1)         add(l, r, x);       else if (op == 2)         assign(l, r, x);       else if (op == 3)         printf( %lld n , rnk(l, r, x));       else         printf( %lld n , calc(l, r, x, y));     }     return 0;   }   