这究竟是为什么呢?
#include<bits/stdc++.h>
#define int long long
#define si set<stu>::iterator
using namespace std;
struct stu{
int l, r;
mutable int val;
bool operator<(const stu &a) const {return l < a.l;}
stu(int L, int R, int Val):l(L), r(R), val(Val){};
stu(int L):l(L){};
};
set<stu> s;
si split(int pos)
{
si it = s.lower_bound(stu(pos));
if(it!=s.end() && it->l==pos) return it;
it--;
int l=it->l, r=it->r, val=it->val;
s.erase(it);
s.insert(stu(l, pos-1, val));
return s.insert(stu(pos, r, val)).first;
}
void assign(int l, int r, int val)
{
si itl=split(l), itr=split(r+1);
s.erase(itl, itr);
s.insert(stu(l, r, val));
}
int n, m, seed, vmax;
int rnd()
{
int ret = seed;
seed = (seed*7+13)%1000000007;
return ret;
}
int fp(int a, int b, int m)
{
// printf("%lld %lld %lld\n", a, b, m);
int t = 1;
a %= m;
while(b)
{
if(b&1) t = (t*a)%m;
a = (a*a)%m;
b >>= 1;
}
// printf("%lld\n", t);
return t;
}
void add(int l, int r, int val)
{
si itl=split(l), itr=split(r+1);
for(si it=itl; it!=itr; it++)
it->val += val;
}
int power(int l, int r, int x, int mod)
{
// printf("%lld %lld %lld %lld\n", l, r, x, mod);
si itl=split(l), itr=split(r+1);
int res = 0;
for(si it=itl; it!=itr; it++)
res = (res+(it->r-it->l+1)*fp(it->val, x, mod))%mod;
return res;
}
int query(int l, int r, int x)
{
si itl=split(l), itr=split(r+1);
vector<int> t;
t.clear();
for(si it=itl; it!=itr; it++)
for(int i=1; i<=r-l+1; i++)
t.push_back(it->val);
if(x > t.size()) return -1;
sort(t.begin(), t.end());
return t[x];
}
signed main()
{
scanf("%lld%lld%lld%lld", &n, &m, &seed, &vmax);
for(int i=1; i<=n; i++)
{
int t = (rnd()%vmax)+1;
s.insert(stu(i, i, t));
// printf("%lld ", t);
}
// printf("\n");
for(int i=1; i<=m; i++)
{
int op, l, r;
op = (rnd()%4) + 1;
l = (rnd()%n) + 1;
r = (rnd()%n) + 1;
if(l > r) swap(l, r);
int x, y=-1;
if(op == 3) x = (rnd()%(r-l+1)) + 1;
else x = (rnd()%vmax) + 1;
if(op == 4) y = (rnd()%vmax) + 1;
// printf("%lld %lld %lld %lld %lld\n", op, l, r, x, y);
if(op==1) add(l, r, x);
else if(op==2) assign(l, r, x);
else if(op==3) printf("%lld\n", query(l, r, x));
else if(op==4) printf("%lld\n", power(l, r, x, y));
}
return 0;
}