经过二分找错,RE出现在assign函数中
#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
long long seed,vmax,a;
long long n,m;
long long x,y;
long long rnd()
{
long long ret=seed;
seed=(seed*7+13)%1000000007;
return ret;
}
struct cun
{
long long a,cnt;
bool operator<(const cun &o)const
{
return a<o.a;
}
};
struct tree
{
long long l,r;
mutable long long v;
bool operator<(const tree &o)const
{
return o.l<l;
}
};
set<tree>t;
auto split(int m)
{
auto it=t.upper_bound({m,0,0});
it--;
if(m==it->l)return it;
int l=it->l,r=it->r,v=it->v;
t.erase(it);
t.insert({l,m-1,v});
return t.insert({m,r,v}).first;
}
void add(long long l,long long r,long long x)
{
auto itr=split(r+1);
auto itl=split(l);
for(auto it=itl;it!=itr;it++)
{
it->v+=x;
}
return;
}
void assign(int l,int r,int v)
{
auto itr=split(r+1);
auto itl=split(l);
t.erase(itl,itr);//在此RE
t.insert({l,r,v});
}
long long _sort(long long l,long long r,long long x)
{
auto itr=split(r+1);
auto itl=split(l);
vector<cun>v;
for(auto it=itl;it!=itr;it++)
{
v.push_back({it->v,it->r-it->l+1});
}
sort(v.begin(),v.end());
long long i;
for(i=0;i<(int)(v.size());i++)
{
if(v[i].cnt<x)
{
x-=v[i].cnt;
}
else
{
break;
}
}
return v[i].a;
}
long long quick_pow(long long a,long long b,long long p)
{
a%=p;
long long ans=1;
while(b)
{
if(a&1)
{
ans*=a;
}
a=a*a%p;
b>>=1;
}
return ans;
}
long long pow(long long l,long long r,long long b,long long p)
{
auto itr=split(r+1);
auto itl=split(l);
long long ans=0;
for(auto it=itl;it!=itr;it++)
{
ans+=(quick_pow(it->v,b,p)%p)*((it->r-it->l+1)%p)%p;
ans%=p;
}
return ans;
}
int main()
{
scanf("%lld%lld%lld%lld",&n,&m,&seed,&vmax);
for(long long i=1;i<=n;i++)
{
a=rnd()%vmax+1;
t.insert({i,i,a});
}
t.insert({n+1,n+1,0});
while(m--)
{
long long flag=rnd()%4+1;
long long l=rnd()%n+1;
long long r=rnd()%n+1;
if(l>r)swap(l,r);
if(flag==3)x=rnd()%(r-l+1)+1;
else x=rnd()%vmax+1;
if(flag==4)y=rnd()%vmax+1;
if(flag==1)add(l,r,x);
else if(flag==2)assign(l,r,x);
else if(flag==3)printf("%lld\n",_sort(l,r,x));
else printf("%lld\n",pow(l,r,x,y));
}
return 0;
}