样例和一二两个点都是过的,第三个点莫名wa掉了,一看题目讨论区全是第三个点wa掉的,但没有一个有回复的,有没有大佬能指点一二
#include<bits/stdc++.h>
# define IT set<node>::iterator
# define N (100005)
using namespace std;
typedef long long ll;
ll n,m,seed,vmax;
ll a[N];
struct node{
int l,r;
mutable ll v;
node(int L,int R=0,int V=0):l(L),r(R),v(V){}
bool operator<(const node &x)const{
return l<x.l;
}
};
set<node>odt;
IT split(int p){
IT it=odt.lower_bound(p);
if(it!=odt.end()&&it->l==p)return it;
it--;
if(it->r<p)return odt.end();
int l=it->l,r=it->r;
ll v=it->v;
odt.erase(it);
odt.insert(node(l,p-1,v));
return odt.insert(node(p,r,v)).first;
}
void assign(int l,int r,int v){
IT itr=split(r+1),itl=split(l);
odt.erase(itl,itr);
odt.insert(node(l,r,v));
return;
}
void add(int l,int r,int v){
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;itl++)
itl->v+=v;
return;
}
ll rnk(int l,int r,int k){
vector<pair<ll,int> >v;
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;itl++)
v.push_back(make_pair(itl->v,(itl->r-itl->l+1)));
for(vector<pair<ll,int> >::iterator i=v.begin();i!=v.end();i++){
k-=i->second;
if(k<=0)
return i->first;
}
}
ll pow(int x,int y,int m){
ll r=1,base=x;
while(y){
if(y&1)
r=(r*base)%m;
base=(base*base)%m;
y>>=1;
}
return r;
}
ll sum(int l,int r,int x,int y){
IT itr=split(r+1),itl=split(l);
ll s=0;
for(;itl!=itr;itl++)
s=(s+(itl->r-itl->l+1)*pow(itl->v,x,y)%y)%y;
return s;
}
inline ll rnd(){
ll ret=seed;
seed=(seed*7+13)%1000000007;
return ret;
}
int main(){
int i,j;
int op,l,r;
ll x,y;
scanf("%d%d%d%d",&n,&m,&seed,&vmax);
for(i=1;i<=n;i++){
a[i]=rnd()%vmax+1;
odt.insert(node(i,i,a[i]));
}
for(i=1;i<=m;i++){
op=(rnd()%4)+1;
l=(rnd()%n)+1;
r=(rnd()%n)+1;
if(l>r)
swap(l,r);
if(op==3)
x=(rnd()%(r-l+1))+1;
else
x=(rnd()%vmax)+1;
if(op==4)
y=(rnd()%vmax)+1;
if(op==1)
add(l,r,x);
if(op==2)
assign(l,r,x);
if(op==3)
printf("%lld\n",rnk(l,r,x));
if(op==4)
printf("%lld\n",sum(l,r,x,y));
}
return 0;
}