#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<set>
#include<stdio.h>
#include<cmath>
#include<cstdlib>
#include<cassert>
#define ll long long
using namespace std;
const ll mod=1000000007;
ll n,m,seed,vmax;
ll rnd(){
ll ret=seed;
seed=(seed*7+13)%mod;
return ret;
}
template<class _T>
class Chtholly_Tree{
private:
struct zone{
int l,r;
mutable _T val;
zone(int a=-1,int b=-1,_T c=0){
l=a;r=b;val=c;
}
bool operator < (zone a)const{
return l<a.l;
}
};
set<zone>st;
typename set<zone>::iterator split(int pos){
typename set<zone>::iterator it=st.lower_bound(zone(pos));
if(it!=st.end()&&it->l==pos)return it;
--it; zone tmp=*it; st.erase(it);
st.insert(zone(tmp.l,pos-1,tmp.val));
return st.insert(zone(pos,tmp.r,tmp.val)).first;
}
ll ksm(ll a,ll b,ll p){
a%=p;
ll res=1;
while(b){
if(b&1)res=(res*a)%p;
a=(a*a)%p;
b=b>>1;
}
return res;
}
public:
void init(){
st.clear();
for(int i=1;i<=n;i++){
ll in=(rnd() % vmax) + 1ll;
st.insert((zone){i,i,in});
}
}
void assign(int l,int r,_T val){
typename set<zone>::iterator itr=split(r+1),itl=split(l);
st.erase(itl,itr);
st.insert((zone){l,r,val});
}
_T query_sum(int l,int r){
typename set<zone>::iterator itr=split(r+1),itl=split(l);
_T res=0;
for(typename set<zone>::iterator it = itl;it!=itr;++it){
res+=(it->r - it->l + 1)*it->val;
}
return res;
}
void add(int l,int r,_T val){
typename set<zone>::iterator itr=split(r+1),itl=split(l);
for(typename set<zone>::iterator it=itl;it!=itr;++it){
it->val+=val;
}
}
_T query_Kth(int l,int r,int k){
vector<pair<ll,int> >vec;
vec.clear();
typename set<zone>::iterator itr=split(r+1),itl=split(l);
for(typename set<zone>::iterator it=itl;it!=itr;++it){
vec.push_back(make_pair(it->val,((it->r) - (it->l) +1ll)));
}
sort(vec.begin(),vec.end());
for(typename vector<pair<ll,int> >::iterator it=vec.begin();it!=vec.end();++it){
if(k-=it->second <=0)return it->first;
}
assert(false);
return -1;
}
_T query_M(int l,int r,ll b,ll p){
ll res=0;
typename set<zone>::iterator itr=split(r+1),itl=split(l);
for(typename set<zone>::iterator it=itl;it!=itr;++it){
res=( (res+(ksm(it->val,b,p)*((ll)(it->r)-(it->l)+1ll)%p))%p )%p;
}
return res;
}
};
Chtholly_Tree<ll>cht;
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>seed>>vmax;
cht.init();
/*
for(int i=1;i<=n;i++){
ll in=(rnd() % vmax) + 1ll;
//cout<<in<<" ";
cht.assign(i,i,in);
}*/
//cout<<"\n";
for(int i=1;i<=m;i++){
int op = (rnd() % 4) + 1;
int l = (rnd() % n) + 1;
int r = (rnd() % n) + 1;
if (l > r) swap(l, r);
ll x,y;
if (op == 3)
x = (rnd() % (ll)(r - l + 1ll)) + 1ll;
else
x = (rnd() % vmax) + 1ll;
if (op == 4)
y = (rnd() % vmax) + 1ll;
if(op==1){
cht.add(l,r,x);
}
if(op==2){
cht.assign(l,r,x);
}
if(op==3){
cout<<cht.query_Kth(l,r,x)<<endl;
}
if(op==4){
cout<<cht.query_M(l,r,x,y)<<endl;
//cout<<l<<" "<<r<<" "<<x<<" "<<y<<endl;
}
//else{
///// cout<<l<<" "<<r<<" "<<x<<endl;
//}
}
return 0;
}