except: '2435844051', found: '542737099'
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,Mod=1e9+7;
int a[N],n,m,sd,vmax;
//==================================================
struct Cty
{
int l,r; mutable int x;
Cty(int a=0,int b=-1,int c=0):l(a),r(b),x(c){}
inline bool operator< (const Cty&o)const{return o.l>l;}
};
set<Cty> odt;
typedef set<Cty>::iterator iter;
iter split(int x)
{
if(x>n) return odt.end();
iter it=--odt.upper_bound(Cty(x,0,0));
if(it->l==x) return it;
int l=it->l,r=it->r,v=it->x;
odt.erase(it);
odt.insert(Cty(l,x-1,v));
return odt.insert(Cty(x,r,v)).first;
}
void assign(int l,int r,int v)
{
iter ir=split(r+1),il=split(l);
odt.erase(il,ir); odt.insert(Cty(l,r,v));
}
void add(int l,int r,int d)
{
iter ir=split(r+1),il=split(l);
for( ; il!=ir; ++il) il->x+=d;
}
int Pow(int a,int b,int p)
{
int res=1;
for( ; b; a=1ll*a*a%p,b>>=1)
if(b&1) res=1ll*res*a%p;
return res;
}
int sum(int l,int r,int x,int y)
{
iter ir=split(r+1),il=split(l); int res=0;
for( ; il!=ir; ++il) (res+=1ll*(il->r-il->l+1)*Pow(il->x,x,y)%y)%=y; return res;
}
int kth(int l,int r,int k)
{
iter ir=split(r+1),il=split(l);
vector<pair<int,int> > v;
for( ; il!=ir; ++il)
v.push_back(make_pair(il->x,il->r-il->l+1));
sort(v.begin(),v.end());
for(int i=0; i<v.size(); i++)
{
k-=v[i].second;
if(k<=0) return v[i].first;
}
return -1;
}
//==================================================
int rnd(){int res=sd;sd=(1ll*sd*7+13)%Mod;return res;}
int main()
{
scanf("%d%d%d%d",&n,&m,&sd,&vmax);
for(int i=1; i<=n; i++)
odt.insert(Cty(i,i,rnd()%vmax+1));
// odt.insert(Cty(n+1,n+1,0));
while(m--)
{
int o=rnd()%4+1;
int l=rnd()%n+1;
int r=rnd()%n+1;
if(l>r) swap(l,r);
int d=rnd();
int x=d%(o==3?r-l+1:vmax)+1;
if(o==1) add(l,r,x);
else if(o==2) assign(l,r,x);
else if(o==3) printf("%d\n",kth(l,r,x));
else
{
int y=rnd()%vmax+1;
printf("%d\n",sum(l,r,x,y));
}
}
return 0;
}