RT,调了一个早上了/kk但是总是WA #3。
样例都过了qwq。
所以有dalao能和我说说哪里写挂了吗/kel
#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#define sit set<node>::iterator
using std::cin;
using std::cout;
using std::pair;
using std::set;
using std::sort;
using std::vector;
typedef long long ll;
struct node
{
ll l, r;
mutable ll val;
node(ll l, ll r = 0, ll val = 0) : l(l), r(r), val(val) {}
bool operator<(const node &n) const { return l < n.l; }
};
struct rank
{
ll num;
ll cnt;
bool operator<(const rank &r) const { return num < r.num; }
rank(const node &n) : num(n.val), cnt(n.r - n.l + 1) {}
};
set<node> s;
inline ll qpow(ll b, ll p, ll m)
{
ll ans = 1;
while (p)
{
if (p & 1)
ans = ans * b % m;
b = b * b % m;
p >>= 1;
}
return ans % m;
}
sit split(ll pos)
{
sit it = s.lower_bound(node(pos));
if (it != s.end() && it->l == pos)
return it;
it--;
if (it->r < pos)
return s.end();
ll l = it->l, r = it->r;
ll val = it->val;
s.erase(it);
s.insert(node(l, pos - 1, val));
return s.insert(node(pos, r, val)).first;
}
void assign(ll l, ll r, ll val)
{
sit left, right;
right = split(r + 1);
left = split(l);
s.erase(left, right);
s.insert(node(l, r, val));
}
void add(ll l, ll r, ll val)
{
sit left, right;
right = split(r + 1);
left = split(l);
for (sit it = left; it != right; it++)
it->val += val;
}
ll val(ll l, ll r, ll rnk)
{
sit left, right;
right = split(r + 1);
left = split(l);
vector<rank> vec;
vec.clear();
for (sit it = left; it != right; it++)
vec.push_back(rank(*it));
sort(vec.begin(), vec.end());
for (vector<rank>::iterator it = vec.begin(); it != vec.end(); it++)
{
if (it->cnt < rnk)
rnk -= it->cnt;
else
return it->num;
}
return vec.end()->num;
}
ll powsum(ll l, ll r, ll pow, ll mod)
{
ll res = 0;
sit left, right;
right = split(r + 1);
left = split(l);
for (sit it = left; it != right; it++)
res = (res + (it->r - it->l + 1) * qpow(it->val, pow, mod) % mod) % mod;
return res;
}
ll seed, vmax;
inline ll rnd()
{
ll ret = seed;
seed = (seed * 7 + 13) % 1000000007;
return ret;
}
ll n, m;
signed main()
{
cin >> n >> m >> seed >> vmax;
for (ll i = 1; i <= n; i++)
s.insert(node(i, i, (rnd() % vmax) + 1));
for (ll i = 1; i <= m; i++)
{
ll op, l, r, x, y;
op = (rnd() % 4) + 1;
l = (rnd() % n) + 1;
r = (rnd() % n) + 1;
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;
// std::cout << op << ' ' << l << ' ' << r << ' ' << x << ' ' << y << '\n';
switch (op)
{
case 1:
add(l, r, x);
break;
case 2:
assign(l, r, x);
break;
case 3:
cout << val(l, r, x) << '\n';
break;
case 4:
cout << powsum(l, r, x, y) << '\n';
break;
default:
std::cerr << "DLLXL!!\n";
return -1;
break;
}
}
return 0;
}