基本全是按照题解的命名和思路来写的,码风还算阳间。
样例都过不了,RE 了,求调 qwq。
// Problem: Willem, Chtholly and Seniorious
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF896C
// Memory Limit: 250 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<set>
#include<algorithm>
#include<vector>
#define int long long
const int MOD = 1e9 + 7;
const int N = 1e5 + 5;
int n, m, seed, vmax, a[N];
int rnd(){
int ret = seed;
seed = (seed * 7ll + 13) % MOD;
return ret;
}
struct Node{
int l, r;
mutable int v;
Node(int l, int r = 0, int v = 0): l(l), r(r), v(v) {};
bool operator < (const Node &a) const{
return l < a.l;
}
};
std::set<Node> s;
std::set<Node>::iterator split(int pos){
std::set<Node>::iterator 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 assign(int l, int r, int x){
std::set<Node>::iterator itr = split(r + 1);
std::set<Node>::iterator itl = split(l);
s.erase(itl, itr);
s.insert(Node(l, r, x));
}
void add(int l, int r, int x){
std::set<Node>::iterator itr = split(r + 1);
std::set<Node>::iterator itl = split(l);
for(std::set<Node>::iterator it = itl; it != itr; ++it)
it -> v += x;
}
struct rank{
int num, cnt;
bool operator < (const rank &a) const{
return num < a.num;
}
rank(int num, int cnt): num(num), cnt(cnt){};
};
int get_rank(int l, int r, int x){
std::set<Node>::iterator itr = split(r + 1);
std::set<Node>::iterator itl = split(l);
std::vector<rank> v;
for(std::set<Node>::iterator it = itl; it != itr; ++it)
v.push_back(rank(it -> v, it -> r - it -> l + 1));
std::sort(v.begin(), v.end());
int res = 0;
for(; res < v.size(); ++res)
if(v[res].cnt < x) x -= v[res].cnt;
else break;
return res;
}
int fpow(int x, int y, int p){
int r = 1, base = x % p;
while(y){
if(y & 1) r = r * base % p;
base = base * base % p;
y >>= 1;
}
return r;
}
int get_power(int l, int r, int x, int y){
std::set<Node>::iterator itr = split(r + 1);
std::set<Node>::iterator itl = split(l);
int ans = 0;
for(std::set<Node>::iterator i = itl; i != itr; ++i)
ans = (ans + fpow(i -> v, x, y) * (i -> r, i -> l + 1) % y);
return ans;
}
signed main(){
std::cin >> n >> m >> seed >> vmax;
for(int i = 1; i <= n; ++i)
a[i] = (rnd() % vmax) + 1;
for(int i = 1; i <= m; ++i){
int op = (rnd() % 4) + 1;
int l = (rnd() % n) + 1;
int r = (rnd() % n) + 1;
int x = 0, y = 0;
if(l > r) std::swap(l, r);
if(op == 3) x = (rnd() % (r - l + 1)) + 1;
else x = (rnd() % vmax) + 1;
if(op == 4) y = (rnd() % vmax) + 1;
switch(op){
case 1: add(l, r, x); break;
case 2: assign(l, r, x); break;
case 3: std::cout << get_rank(l, r, x) << "\n"; break;
case 4: std::cout << get_power(l, r, x, y) << "\n"; break;
default: break;
}
}
return 0;
}