#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
#define IT set<node> :: iterator
using namespace std;
const int N = 100010;
int n , m , seed , vmax;
int a[N];
struct node{
int l , r;
mutable int v;
node(int L , int R = -1 , int V = 0) : l(L) , r(R) , v(V) {}
bool operator < (const node &_) const {
return l < _.l;
}
};set<node> s;
int rnd(){
int ret = seed;
seed = (seed * 7 + 13) % 1000000007;
return ret;
}
int qp(int a , int n , int p){
int ans = 1;
while(n){
if(n & 1) ans = (ans * a) % p;
n >>= 1;
a = (a * a) % p;
}
return ans;
}
IT split(int pos){
IT it = s.lower_bound(node(pos));
if(it != s.end() && it -> l == pos) return it; --it;
if(it -> r < pos) return s.end();
int L = it -> l , R = it -> r , V = it -> v;
s.erase(it);
s.insert(node(L , pos - 1 , V));
return s.insert(node(pos , R , V)).first;
}
void add(int l , int r , int x){
IT R = split(r + 1) , L = split(l);
for(IT it = L;it != R;it++) it -> v += x;
}
void assign(int l , int r , int x){
IT R = split(r + 1) , L = split(l);
s.erase(L , R);
s.insert(node(l , r , x));
}
int Rank(int l , int r , int x){
vector<pair<int , int> > t;
IT R = split(r + 1) , L = split(l);
for(IT it = L;it != R;it++) t.push_back({it -> v , it -> r - it -> l + 1});
sort(t.begin() , t.end());
for(int i = 0;i < t.size();i++){
x -= t[i].second;
if(x <= 0) return t[i].first;
}
}
int sum(int l , int r , int x , int y){
int ans = 0;
IT R = split(r + 1) , L = split(l);
for(IT it = L;it != R;it++) ans = (ans + (qp(it -> v , x , y)) * (it -> r - it -> l + 1) % y) % y;
return ans;
}
int main(){
cin >> n >> m >> seed >> vmax;
for(int i = 1;i <= n;i++) a[i] = (rnd() % vmax) + 1;
while(m--){
int opt = (rnd() % 4) + 1;
int l = (rnd() % n) + 1;
int r = (rnd() % n) + 1;
int x , y;
if(l > r) swap(l , r);
if(opt == 3) x = (rnd() % (r - l + 1)) + 1;
else x = (rnd() % vmax) + 1;
if(opt == 4) y = (rnd() % vmax) + 1;
if(opt == 1) add(l , r , x);
else if(opt == 2) assign(l , r , x);
else if(opt == 3) cout << Rank(l , r , x) << endl;
else cout << sum(l , r , x , y) << endl;
}
return 0;
}
不知道哪里写炸了