样例没过,wtcl
可能压行有点难看,凑合看吧。
#include<bits/stdc++.h>
#define SIT set<node>::iterator
using namespace std;
long long ksm(long long a,int b, int mod)
{
long long res=1,ans=a%mod;
while(b)
{
if(b&1)res=res*ans%mod;
ans=ans*ans%mod;
b>>=1;
}
return res%mod;
}
int n;
struct node
{
int l,r;
mutable long long v;
node(int L=1,int R=-1,long long V=0){l=L;r=R;V=v;}
bool operator<(node b)const{return l<b.l;}
};
set<node>odt;
SIT spilt(int mid)
{
SIT it=odt.lower_bound(node(mid));
if(it!=odt.end()&&it->l==mid) return it;
it--;
node temp=*it;
odt.erase(it);
odt.insert(node(temp.l,mid-1,temp.v));
return odt.insert(node(mid,temp.r,temp.v)).first;
}
void assign(int l,int r,long long val)
{
SIT it1=spilt(l),it2=spilt(r+1);
odt.erase(it1,it2);
odt.insert(node(l,r,val));
}
void add(int l,int r,long long val)
{
SIT it1=spilt(l),it2=spilt(r+1);
for(SIT it=it1;it!=it2;it++) it->v+=val;
}
long long sum(int l,int r,int k,int mod)
{
SIT it1=spilt(l),it2=spilt(r+1);
long long res=0;
for(SIT it=it1;it!=it2;it++)
{
res=(res+(ksm(it->v,k,mod)*(it->r-it->l+1)%mod))%mod;
res%=mod;
}
return res%mod;
}
long long rank(int l,int r,int x)
{
vector<pair<long long,int> >ay;
ay.clear();
SIT it1=spilt(l),it2=spilt(r+1);
for(SIT it=it1;it!=it2;it++)ay.push_back(make_pair(it->v,it->r-it->l+1));
sort(ay.begin(),ay.end());
for(int i=0;i<ay.size();i++)
{
x-=ay[i].second;
if(x<=0) return ay[i].first;
}
return -1;
}
long long seed;
long long rnd(){long long res=seed;seed=(seed*7+13)%1000000007;return res;}
long long vmax;
int m;
int main()
{
cin>>n>>m>>seed>>vmax;
for(int i=1;i<=n;i++)
{
long long x;
x=(rnd()%vmax)+1;
odt.insert(node(i,i,x));
}
odt.insert(node(n+1,n+1,0));
for(int i=1;i<=m;i++)
{
short opt=(rnd()%4)+1;
int l=(rnd()%n)+1,r=(rnd()%n)+1;
if(l>r)swap(l,r);
switch(opt)
{
case 1:
{
long long x=(rnd()%vmax)+1;
add(l,r,x);
break;
}
case 2:
{
long long x=(rnd()%vmax)+1;
assign(l,r,x);
break;
}
case 3:
{
int x=(rnd()%(r-l+1))+1;
cout<<rank(l,r,x)<<endl;
break;
}
case 4:
{
long long x=(rnd()%vmax)+1,y=(rnd()%vmax)+1;
cout<<sum(l,r,x,y)<<endl;
break;
}
}
}
return 0;
}