Rt.板子是 cf896c.
似乎是因为操作 4 int overflow,但是取模了啊
#include "bits/stdc++.h"
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define ull unsigned long long
#define OPEN freopen ("structure.in", "r", stdin); freopen ("structure.out", "w", stdout);
#define pc __builtin_popcount
#define db double
#define pii pair<int, int>
#define fi first
#define se second
#define F(i,x,y) for (int i = (x); i <= (y); ++i)
#define D(i,x,y) for (int i = (x); i >= (y); --i)
#define lttm iterator
#define fp iterator
int n, m; ll seed, vmx;
ll a[140000];
ll rng() {
ll ret = seed;
seed = (seed * 7ll + 13ll) % mod;
return ret;
}
struct Chthollytree {
int l, r;
mutable ll x;
bool operator <(const Chthollytree& p) const {
if (l == p.l) return r < p.r;
return l < p.l;
}
};
bool cmp (Chthollytree a1, Chthollytree a2) {
return a1.x < a2.x;
}
set<Chthollytree> s;
void Build () {
Chthollytree now;
F(i, 1, n) {
if (a[i] == a[i - 1]) {
now.r = i;
} else {
if (i != 1) s.insert(now);
now.l = now.r = i;
now.x = a[i];
}
}
s.insert(now);
}
set <Chthollytree> :: fp Split (int x) {
set <Chthollytree> :: lttm it = s.lower_bound({x, 0, 0ll});
if (it != s.end() && it -> l == x) return it;
-- it;
if (it -> r < x) return s.end();
set <Chthollytree> :: fp res = s.insert({x, it -> r, it -> x}).first;
s.insert({it -> l, x - 1, it -> x}).first;
s.erase(it);
return res;
}
void assign (int l, int r, ll x) {
set <Chthollytree> :: fp itl, itr;
itr = Split(r + 1); itl = Split(l);
s.erase(itl, itr); s.insert({l, r, x});
}
void add (int l, int r, ll v) {
set <Chthollytree> :: fp itl, itr;
itr = Split(r + 1); itl = Split(l);
for (set <Chthollytree> :: lttm it = itl; it != itr; ++ it) {
it->x += v;
}
}
ll Querykth (int l, int r, int k) {
vector<Chthollytree> v;
for (set <Chthollytree> :: lttm it = s.begin(); it != s.end(); ++ it) {
int _l = it -> l, _r = it -> r;ll _x = it -> x;
if (l <= _l && _r <= r) v.push_back({_l, _r, _x});
else if (_l <= l && r <= _r) v.push_back({l, r, _x});
else if (_l < l && l <= _r) v.push_back({l, _r, _x});
else if (r < _r && _l <= r) v.push_back({_l, r, _x});
}
sort (v.begin(), v.end(), cmp);
int qwq = 0;
for (auto i : v) {
qwq += (i.r - i.l + 1);;
if (qwq >= k) {
return i.x;
}
}
}
ll qpow(ll x, ll y, ll p) {
if (y == 0ll) return 1ll;
ll qwq = qpow(x, y >> 1ll, p) % p;
if (y % 2ll) return ((qwq * qwq % p) * x) % p;
else return qwq * qwq % p;
}
ll Getsum (int l, int r, ll w, ll p) {
vector<Chthollytree> v;
for (set <Chthollytree> :: fp it = s.begin(); it != s.end(); ++ it) {
int _l = it -> l, _r = it -> r;ll x = it -> x;
if (l <= _l && _r <= r) v.push_back({_l, _r, x});
else if (_l <= l && r <= _r) v.push_back({l, r, x});
else if (_l < l && l <= _r) v.push_back({l, _r, x});
else if (r < _r && _l <= r) v.push_back({_l, r, x});
}
ll res = 0ll;
for (auto i : v) {;
res += (1ll * (i.r - i.l + 1)) * qpow(i.x, w, p) % p;
res %= p;
}
return res;
}
int main() {
cin >> n >> m >> seed >> vmx;
F(i, 1, n) a[i] = rng() % vmx + 1;
// F(i, 1, n) cerr << a[i] << ' '; cerr << '\n';
Build();
F(i, 1, m) {
// cerr << i << ' ' << (double) clock() / CLOCKS_PER_SEC << '\n';
int op = rng() % 4 + 1;
int L = rng() % n + 1; int R = rng() % n + 1;
if (L > R) swap(L, R);
int k; ll x, p;
if (op == 3) k = rng() % (R - L + 1) + 1;
else x = rng() % vmx + 1;
if (op == 4) p = rng() % vmx + 1;
if (op == 1) add(L, R, x);
else if (op == 2) assign(L, R, x);
else if (op == 3) cout << Querykth(L, R, k) << '\n';
else cout << Getsum(L, R, x, p) << '\n';
}
}