#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
#define int long long
#define IT set<node>::iterator
using namespace std;
int n,m;
int seed;
int vmax;
int a[1000001];
struct node{
int l,r;mutable int val;
node(int L=0,int R=0,int VAL=0){l=L,r=R,val=VAL;}
bool operator <(const node &b) const{return l<b.l;}
};
set <node> ODT;
IT split(int pos){
IT p=ODT.lower_bound((node){pos,pos,0});
if(p!=ODT.end()&&p->l==pos) return p;
--p;
int v=p->val;
int R=p->r;
int L=p->l;
ODT.erase(p);
ODT.insert((node){L,pos-1,v});
return ODT.insert((node){pos,R,v}).first;
}
void assign(int l,int r,int k){
IT pos2=split(r+1),pos1=split(l);
ODT.erase(pos1,pos2);
ODT.insert((node){l,r,k});
}
void add(int l,int r,int k){
IT pos2=split(r+1),pos1=split(l);
for(IT it=pos1;it!=pos2;++it) it->val+=k;
}
int kth(int l,int r,int k){
IT pos2=split(r+1),pos1=split(l);
vector<node> P;P.clear();
int cnt=0;
for(IT it=pos1;it!=pos2;++it) {
P.push_back(*it);
}
sort(P.begin(),P.end());
for(auto it:P){
cnt+=(it.r-it.l+1);
if(cnt>=k) return it.val;
}
return 0;
}
int ksm(int base,int p,int mod){
base%=mod;
int ans=1;
while(p){
if(p&1) ans=(ans*base)%mod;
base=(base*base)%mod;
p>>=1;
}
return ans;
}
int ask_pow(int l,int r,int k,int y){
IT pos2=split(r+1),pos1=split(l);
int cnt=0;
for(IT it=pos1;it!=pos2;++it){
cnt+=((it->r-it->l+1)*ksm(it->val,k,y))%y;
cnt%=y;
}
return cnt;
}
int rnd(){
int ret=seed;
seed=(seed*7+13)%1000000007;
return ret;
}
void getin(){
for(int i=1;i<=n;i++){
a[i]=(rnd()%vmax)+1;
}
for(int i=1;i<=n;i++){
ODT.insert((node){i,i,a[i]});
}
// ODT.insert((node){n+1,n+1,0});
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){
assign(l,r,x);
}
if(op==3){
printf("%d\n",kth(l,r,x));
}
if(op==4){
printf("%d\n",ask_pow(l,r,x,y));
}
}
}
signed main(){
cin>>n>>m>>seed>>vmax;
getin();
}
自闭了。 试过了快速幂模底数,也加上了longlong 求调,万分感谢