#include<bits/stdc++.h>
#define IT set<node>::iterator
using namespace std;
long long quickpow(long long x,long long y,long long z)
{
long long ans=1;
while(y)
{
if(y&1) ans=(ans*x)%z;
x=(x*x)%z;
y>>=1;
}
return ans%z;
}
const int maxn=1e5+10;
struct node
{
int l,r;
mutable long long v;
node(int L,int R=-1,long long V=0):l(L),r(R),v(V) {}
bool operator<(const node& o) const
{
return l<o.l;
}
};
set<node> s;
IT split(int pos)
{
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos) return it;
--it;
int L=it->l,R=it->r;
long long V=it->v;
s.erase(it);
s.insert(node(L,pos-1,V));
return s.insert(node(pos,R,V)).first;
}
void assign(int l,int r,long long val=0)
{
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,val));
}
void add(int l,int r,long long val=1)
{
IT itr=split(r+1),itl=split(l);
while(itl!=itr)
{
itl->v+=val;
itl++;
}
}
long long rank1(int l,int r,int k)
{
vector< pair<long long,int> > vp;
IT itr=split(r+1),itl=split(l);
vp.clear();
while(itl!=itr)
{
vp.push_back(pair<long long,int>(itl->v,itl->r - itl->l + 1));
itl++;
}
sort(vp.begin(),vp.end());
for(vector< pair<long long,int> >::iterator it=vp.begin();it!=vp.end();++it)
{
k-=(it->second);
if(k<=0) return it->first;
}
return -1LL;
}
long long sumt(int l,int r,int ex,int mod)
{
IT itr=split(r+1),itl=split(l);
long long res=0;
while(itl!=itr)
{
res=(res+(long long)(itl->r - itl->l +1)*quickpow(itl->v , (long long)(ex) , (long long)(mod)))%mod;
itl++;
}
return res;
}
int n,m;
long long seed,valmax;
const int mmod=1e9+7;
int random()
{
long long ret=seed;
seed=(seed*7+13)%(mmod);
return ret;
}
long long numlist[maxn];
int main()
{
scanf("%d %d %d %d",&n,&m,&seed,&valmax);
for(int i=1;i<=n;i++)
{
numlist[i]=(random()%valmax)+1;
s.insert(node(i,i,numlist[i]));
}
for(int i=1;i<=m;i++)
{
int op=(random()%4)+1,l=(random()%n)+1,r=(random()%n)+1;
if(l>r) swap(l,r);
int x,y;
if(op==3) x=(random()%(r-l+1))+1;
else x=(random()%valmax)+1;
if(op==4) y=(random()%valmax)+1;
if(op==1) add(l,r,x);
else if(op==2) assign(l,r,x);
else if(op==3) printf("%lld\n",rank1(l,r,x));
else printf("%lld\n",sumt(l,r,x,y));
}
return 0;
}
https://www.luogu.com.cn/record/51893938
呜呜