#include <bits/stdc++.h>
#define LL long long
#define int long long
using namespace std;
const int MAXN=1e5+5;
const int MOD=1e9+7;
int col=0;
struct Chtholly
{
int nxt=-1;
int l,r;
int c;
bool operator<(const Chtholly &j) const
{
return c<j.c;
}
}odt[MAXN<<1];
int hd=1,tot;
int N,M,seed,vmax;
int a[MAXN];
inline int Rand()
{
int res=seed;
seed=(1ll*seed*7+13)%MOD;
return res;
}
inline int Split(int x)
{
for(int i=1;i!=-1;i=odt[i].nxt)
{
if(odt[i].l==x) return i;
if(odt[i].l<x&&odt[i].r>=x)
{
odt[++tot]={odt[i].nxt,x,odt[i].r,odt[i].c};
odt[i].nxt=tot;
odt[i].r=x-1;
return odt[i].nxt;
}
}
return -1;
}
void Add(int bl,int br,int x)
{
for(int i=bl;i!=br;i=odt[i].nxt) odt[i].c+=x;
return;
}
void Assign(int bl,int br,int x)
{
if(br==-1) odt[bl].r=N;
else odt[bl].r=odt[br].l-1;
odt[bl].c=x;
odt[bl].nxt=br;
return;
}
int QPow(LL base,int po,LL mod)
{
LL res=1;
while(po)
{
if(po&1) res=res%mod*(base)%mod;
base=base%mod*(base)%mod;
po>>=1;
}
return (int)res%mod;
}
int Value(int bl,int br,int k)
{
vector<Chtholly>vec;
vec.clear();
for(int i=bl;i!=br;i=odt[i].nxt) vec.push_back(odt[i]);
sort(vec.begin(),vec.end());
k--;
for(auto i:vec)
{
int len=i.r-i.l+1;
k-=len;
if(k<0) return i.c;
}
return -1;
}
int PowSum(int bl,int br,int x,int y)
{
LL res=0;
for(int i=bl;i!=br;i=odt[i].nxt)
{
res=res+1ll*(odt[i].r-odt[i].l+1)*QPow(odt[i].c%y,x,y)%y;
res%=y;
}
return res;
}
signed main()
{
scanf("%lld %lld %lld %lld",&N,&M,&seed,&vmax);
for(int i=1;i<=N;i++)
{
a[i]=(Rand()%vmax)+1;
odt[i]={i+1,i,i,a[i]};
odt[N].nxt=-1;
}
tot=N;
while(M--)
{
int opt,l,r,x;
opt=Rand()%4+1,l=Rand()%N+1,r=Rand()%N+1;
if(l>r) swap(l,r);
x=opt==3?Rand()%(r-l+1)+1:Rand()%vmax+1;
int br=Split(r+1),bl=Split(l);
if(opt==1) Add(bl,br,x);
if(opt==2) Assign(bl,br,x);
if(opt==3) printf("%lld\n",Value(bl,br,x));
if(opt==4) printf("%lld\n",PowSum(bl,br,x,Rand()%vmax+1));
}
return 0;
}