rt, code :
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
const ll mod = 1e9 + 7;
ll n, m, seed, vmax;
struct node {
ll l, r; mutable ll v;
node (ll L, ll R = -1, ll V = 0) {
l = L, r = R, v = V;
}
friend bool operator < (node x, node y) {
return x.l < y.l;
}
}; set<node> odt;
ll qpow(ll a, ll b, ll mod) {
ll ans = 1; a %= mod;
while (b) {
if (b & 1) {
ans = ans * a % mod;
}
a = a % mod * a % mod % mod;
b >>= 1;
}
return ans;
}
set<node>::iterator split(ll x) {
set<node>::iterator it = odt.lower_bound(node(x));
if (it != odt.end() && it -> l == x) return it;
it --;
ll l = it -> l, r = it -> r, v = it -> v;
odt.erase(it); odt.insert(node(l, x - 1, v));
return odt.insert(node(x, r, v)).first;
}
void modify(ll l, ll r, ll V) {
set<node>::iterator itr = split(r + 1), itl = split(l);
for (; itl != itr; itl ++) {
itl -> v += V;
}
}
void assign(ll l, ll r, ll V) {
set<node>::iterator itr = split(r + 1), itl = split(l);
odt.erase(itl, itr); odt.insert(node(l, r, V));
}
ll kth(ll l, ll r, ll k) {
vector< pair<ll, ll> > tmp; set<node>::iterator itr = split(r + 1), itl = split(l);
tmp.clear();
for (; itl != itr; itl ++) {
tmp.push_back(pair<ll, ll>(itl -> v, ((itl -> r) - (itl -> l) + 1)));
}
sort(tmp.begin(), tmp.end());
for(vector< pair<ll, ll> >::iterator it = tmp.begin(); it != tmp.end(); it ++) {
k -= it -> second;
if (k <= 0) return it -> first;
}
return -1;
}
ll sum(ll l, ll r, ll k, ll mod) {
ll res = 0; set<node>::iterator itr = split(r + 1), itl = split(l);
for (; itl != itr; itl ++) {
res += (((itl -> r) - (itl -> l) + 1) * qpow(itl -> v, k, mod) + mod) % mod;
}
return res;
}
ll rnd() {
ll res = seed;
seed = (seed * 7 + 13) % mod;
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m >> seed >> vmax;
for (ll i = 1, x; i <= n; i++) {
x = (rnd() % vmax) + 1;
odt.insert(node(i, i, x));
}
odt.insert(node(n + 1, n + 1, 0));
while (m--) {
ll op = (rnd() % 4) + 1, l = (rnd() % n) + 1, r = (rnd() % n) + 1, x = 0, y = 0;
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) {
modify(l, r, x);
} else if (op == 2) {
assign(l, r, x);
} else if (op == 3) {
cout << kth(l, r, x) << endl;
} else {
cout << sum(l, r, x, y) << endl;
}
}
}
感觉自己没写错,但是就是似了 qwq