#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#define int long long
using namespace std;
struct intt
{
int l,r;
mutable int v;
bool operator < (const intt &x) const
{
return l<x.l;
}
intt(int L,int R,int V)
{
l=L;
r=R;
v=V;
}
};
set<intt> tree;
int n,m,seed,vmax;
auto split(int op)
{
auto it=tree.lower_bound(intt(op,0,0));
if(it!=tree.end()&&it->l==op)
return it;
--it;
if(it->r<op)
return tree.end();
int l=it->l;
int r=it->r;
int v=it->v;
tree.erase(it);
tree.insert(intt(l,op-1,v));
return tree.insert(intt(op,r,v)).first;
}
void tp(int l,int r,int k)
{
auto ir=split(r+1),il=split(l);
tree.erase(il,ir);
tree.insert(intt(l,r,k));
}
void add(int l,int r,int k)
{
auto ir=split(r+1),il=split(l);
for(;il!=ir;il++)
il->v+=k;
}
void q1(int l,int r,int k)
{
vector<pair<int,int>> qwq;
auto ir=split(r+1),il=split(l);
for(auto i=il;i!=ir;i++)
qwq.push_back(make_pair(i->v,i->r-i->l+1));
sort(qwq.begin(),qwq.end());
for(auto i=qwq.begin();i!=qwq.end();i++)
{
k-=i->second;
if(k<=0)
{
cout<<i->first<<"\n";
return;
}
}
}
int qsm(int a,int x,int m)
{
int ans=1%m;
a%=m;
while(x)
{
if(x&1)
ans*=a,ans%=m;
a*=a;
a%=m;
x>>=1;
}
ans%=m;
return ans;
}
void q2(int l,int r,int x,int y)
{
int ans=0;
auto ir=split(r+1),il=split(l);
for(;il!=ir;il++)
ans+=qsm(il->v,x,y),ans%=y;
ans%=y;
cout<<ans<<"\n";
}
int rnd()
{
int ret=seed;
seed = (seed * 7 + 13) % 1000000007;
return ret;
}
signed main()
{
cin>>n>>m>>seed>>vmax;
for(int i=1;i<=n;i++)
{
int qwp=(rnd() % vmax) + 1;
tree.insert(intt(i,i,qwp));
}
for(int i=1;i<=m;i++)
{
int op,l,r,x,y;
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() % vmax) + 1;
if (op == 4)
y = (rnd() % vmax) + 1;
if(op==1)
add(l,r,x);
if(op==2)
tp(l,r,x);
if(op==3)
q1(l,r,x);
if(op==4)
q2(l,r,x,y);
// signed nb=1;
// for(auto i=tree.begin();i!=tree.end();i++,nb++)
// cout<<nb<<":"<<i->l<<" "<<i->r<<"\n";
}
}
蒟蒻实在是不会惹qwq