#include<bits/stdc++.h>#define int long longusingnamespace std;
constint N = 1e5 + 100;
constint Mod = 1000000007;
int n, m, seed, vmax, a[N];
structodt {
int l, r;
mutableint v;
odt(int l, int r = 0, int v = 0) : l(l), r(r), v(v) {}
constbooloperator < (const odt &e) const {
return l < e.l;
}
};
set<odt> s;
set<odt>::iterator split(int x){
auto it = s.lower_bound(odt(x));
if (it != s.end() && it -> l == x) return it;
it--; if (it -> r < x) return s.end();
int l = it -> l, r = it -> r, v = it -> v;
s.erase(it), s.insert(odt(l, x - 1, v));
return s.insert(odt(x, r, v)).first;
}
voidassign(int l, int r, int x){
set<odt>::iterator itr = split(r + 1), itl = split(l);
s.erase(itl, itr), s.insert(odt(l, r, x));
}
voidadd(int l, int r, int x){
set<odt>::iterator itr = split(r + 1), itl = split(l);
for (auto it = itl; it != itr; it++) it -> v += x;
}
intqpow(int a, int b, int mod){
if (!b) return1;
int tmp = qpow(a, b / 2, mod);
if (b & 1) return tmp % mod * tmp % mod * a % mod;
return tmp % mod * tmp % mod;
}
structNode {
int num, cnt;
booloperator < (const Node &e) const {
return num < e.num;
}
Node(int num, int cnt) : num(num), cnt(cnt) {}
};
intrnk(int l, int r, int x){
set<odt>::iterator itr = split(r + 1), itl = split(l);
vector<Node> v;
for (auto it = itl; it != itr; it++) {
v.push_back(Node(it -> v, it -> r - it -> l + 1));
}
sort(v.begin(), v.end());
int i;
for (i = 0; i < v.size(); i++) {
if (v[i].cnt < x) x -= v[i].cnt;
elsebreak;
}
return v[i].num;
}
intgetsum(int l, int r, int x, int y){
set<odt>::iterator itr = split(r + 1), itl = split(l);
int ans = 0;
for (auto it = itl; it != itr; it++) {
ans = (ans + qpow(it -> v % y, x, y) * (it -> r - it -> l + 1) % y) % y;
}
return ans;
}
intrnd(){
int ret = seed;
seed = (seed * 7 + 13) % Mod;
return ret;
}
signedmain(){
cin >> n >> m >> seed >> vmax;
for (int i = 1; i <= n; i++) {
a[i] = (rnd() % vmax) + 1;
s.insert(odt(i, i, a[i]));
}
for (int i = 1, x, y; i <= m; i++) {
int opt = (rnd() % 4) + 1, l = (rnd() % n + 1), r = (rnd() % n + 1);
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);
if (opt == 2) assign(l, r, x);
if (opt == 3) cout << rnk(l, r, x) << '\n';
if (opt == 4) cout << getsum(l, r, x, y) << '\n';
}
return0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效