样例过了,WA了。。。
不会是我随机数取错了吧
#include<algorithm>
#include<utility>
#include<cstdio>
#include<vector>
#include<set>
typedef long long ll;
inline ll pow(ll a,ll b,ll mod){
ll ans=1;a%=mod;
for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;
return ans;
}
struct Node{
int L,R;
mutable ll val;
Node(int L,int R=-1,ll val=0):L(L),R(R),val(val){}
inline bool operator<(const Node&b) const {
return L<b.L;
}
};
typedef std::set<Node>::iterator Iter;
std::set<Node>Chtholly;
inline Iter spilt(int pos){
Iter iter=Chtholly.lower_bound(Node(pos));
if(iter!=Chtholly.end()&&iter->L==pos)return iter;
--iter;
int L=iter->L,R=iter->R,V=iter->val;
Chtholly.erase(iter);
Chtholly.insert(Node(L,pos-1,V));
return Chtholly.insert(Node(pos,R,V)).first;
}
inline void Add(int L,int R,ll val=1){
Iter iter=spilt(L),end=spilt(R+1);
for(;iter!=end;++iter)iter->val+=val;
}
inline void assign(int L,int R,ll val=0){
Iter terL=spilt(L),terR=spilt(R+1);
Chtholly.erase(terL,terR);
Chtholly.insert(Node(L,R,val));
}
inline ll Rank(int L,int R,int k){
std::vector<std::pair<ll,int> >s;
Iter iter=spilt(L),end=spilt(R+1);
for(;iter!=end;++iter){
s.push_back(std::pair<ll,int>(iter->val,iter->R-iter->L+1));
}
std::sort(s.begin(),s.end());
for(std::vector<std::pair<ll,int> >::iterator iter=s.begin();iter!=s.end();++iter){
k-=iter->second;
if(k<=0)return iter->first;
}
return -1ll;
}
inline ll Sum(int L,int R,ll k,ll mod){
Iter iter=spilt(L),end=spilt(R+1);
ll ans=0;
for(;iter!=end;++iter){
ans=(ans+(iter->R-iter->L+1)*pow(iter->val,k,mod)%mod)%mod;
}
return ans;
}
ll n,m,seed,vmax;
const int MOD=1e9+7;
inline ll rnd(){
ll ret=seed;
seed=(seed*7+13)%MOD;
return ret;
}
signed main(){
int i;
scanf("%lld%lld%lld%lld",&n,&m,&seed,&vmax);
for(i=1;i<=n;++i)Chtholly.insert(Node(i,i,rnd()%vmax+1));
Chtholly.insert(Node(n+1,n+1,0));
for(i=1;i<=m;++i){
int op=rnd()%4+1,L=rnd()%n+1,R=rnd()%n+1,x,y;
if(L>R)L^=R^=L^=R;
x=rnd()%(op==3?R-L+1:vmax)+1;
if(op==4)y=rnd()%vmax+1;
if(op==1){
Add(L,R,x);
}
if(op==2){
assign(L,R,x);
}
if(op==3){
printf("%lld\n",Rank(L,R,x));
}
if(op==4){
printf("%lld\n",Sum(L,R,x,y));
}
}
}