Wrong Answer.
wrong answer 158th numbers differ - expected: '25529012', found: '38104142'
#include <bits/stdc++.h>
#define int long long
const int Mod = 1e9 + 7;
using namespace std;
struct node {
int l, r;
mutable int val;
node(int _l = 0, int _r = -1, int _val = 0) : l(_l), r(_r), val(_val) {}
bool operator < (const node &x) const {
return l < x.l;
}
};
int n, m, seed, vmax;
set<node> s;
typedef set<node>::iterator iter;
inline iter split(int pos) {
iter it = s.lower_bound(node(pos));
if(it != s.end() && it->l == pos) return it;
it--;
node tmp = *it;
s.erase(it), s.insert(node(tmp.l, pos - 1, tmp.val));
return s.insert(node(pos, tmp.r, tmp.val)).first;
}
inline void assign(int l, int r, int val) {
iter itr = split(r + 1), itl = split(l);
s.erase(itl, itr);
s.insert(node(l, r, val));
}
inline void add(int l, int r, int val) {
iter itr = split(r + 1), itl = split(l);
for(iter it = itl; it != itr; it++)
it->val += val;
}
inline int kth(int l, int r, int k) {
vector<pair<int, int> > a;
a.clear();
iter itr = split(r + 1), itl = split(l);
for(iter it = itl; it != itr; it++) a.push_back(make_pair(it->val, it->r - it->l + 1));
sort(a.begin(), a.end());
for(int i = 0; i < a.size(); i++) {
k -= a[i].second;
if(k <= 0) return a[i].first;
}
return -1;
}
inline int qpow(int x, int y, int mod) {
int res = 1;
while(y) {
if(y & 1) res = res * x % mod;
x = x * x % mod, y >>= 1;
}
return res;
}
inline int getpow(int l, int r, int x, int y) {
int res = 0;
iter itr = split(r + 1), itl = split(l);
for(iter it = itl; it != itr; it++) {
res = (res + (it-> r - it->l + 1) * qpow(it->val % y, x, y) % y) % y;
}
return res;
}
inline int rnd() {
int res = seed;
seed = (seed * 7 + 13) % Mod;
return res;
}
signed main() {
cin >> n >> m >> seed >> vmax;
for(int i = 1; i <= n; i++) s.insert(node(i, i, rnd() % vmax + 1));
for(int i = 1; i <= m; i++) {
int op = rnd() % 4 + 1, l = rnd() % n + 1, r = rnd() % n + 1, x, y;
if(l > r) swap(l, r);
if(op == 3) x = rnd() % (r - l + 1) + 1;
else x = rnd() % vmax + 1;
if(op == 1) add(l, r, x);
else if(op == 2) assign(l, r, x);
else if(op == 3) printf("%lld\n", kth(l, r, x));
else y = rnd() % vmax + 1, printf("%lld\n", getpow(l, r, x, y));
}
return 0;
}