RT
#include<bits/stdc++.h>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
const ll MAXN=1e5+5,MOD=1e9+7;
ll n,m;
ll seed,vmax;
ll ret;
ll op,_l,_r,_x,_y;
ll rnd(){
ret=seed;
seed=(seed*7+13)%MOD;
return ret;
}
ll a[MAXN];
struct col_t{
ll l,r;
mutable ll v;
bool operator < (const col_t &oth)const{
l<oth.l;
}
};
set<col_t> tree;
auto split(ll num){
cout<<"num: "<<num<<endl;
if(num>n)return tree.end();
set<col_t>::iterator it = --tree.upper_bound((col_t){num,0,0});
for(auto itt:tree)cout<<itt.l<<" "<<itt.r<<" debug"<<endl;
if(it==tree.end())cout<<"?"<<endl;//here
if(it->l == num)return it;
ll now_l = it->l,now_r = it->r,now_v = it->v;
cout<<now_l<<" "<<now_r<<" "<<now_v<<endl;
tree.erase(it);
tree.insert((col_t){now_l,num-1,now_v});
return tree.insert((col_t){num,now_r,now_v}).first;
}
void assign(ll l,ll r,ll k){
cout<<l<<" - "<<r<<endl;
auto it_r=split(r+1),it_l=split(l);
tree.erase(it_l,it_r);
tree.insert((col_t){l,r,k});
return;
}
void add(ll l,ll r,ll k){
auto it_r=split(r+1),it_l=split(l);
for(;it_l!=it_r;++it_l)it_l->v +=k;
return;
}
struct Rank{
ll val,sz;
bool operator < (const Rank &oth)const{
return val<oth.val;
}
};
ll rk(ll l,ll r,ll k){
auto it_r=split(r+1),it_l=split(l);
vector<Rank> vec;
for(;it_l!=it_r;++it_l)vec.push_back((Rank){it_l->v,it_l->r - it_l->l + 1});
sort(vec.begin(),vec.end());
int i=0;
for(i=0;i<vec.size();i++){
if(vec[i].sz<k)k-=vec[i].sz;
else break;
}
return vec[i].val;
}
ll fpow(ll x,ll y,ll p){
ll ans=1;
while(y){
if(y&1)ans=ans*x%p;
x=x*x%p;
y>>=1;
}
return ans;
}
ll query(ll l,ll r,ll k,ll p){
auto it_r=split(r+1),it_l=split(l);
ll ans=0;
for(;it_l!=it_r;++it_l){
ans=(ans+(it_l->r-it_l->l+1)*fpow(it_l->v,k,p)%p)%p;
cout<<"L"<<endl;
}
cout<<"???"<<endl;
return ans;
}
int main(){
cin>>n>>m>>seed>>vmax;
for(int i=1;i<=n;i++)a[i]=(rnd()%vmax)+1;
tree.clear();
for(int i=1;i<=n;i++)tree.insert((col_t){i,i,a[i]});
for(int 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;
cout<<op<<" "<<_l<<" "<<_r<<" "<<_x<<" "<<_y<<endl;
if(op==1)add(_l,_r,_x);
else if(op==2)assign(_l,_r,_x);
else if(op==3)cout<<rk(_l,_r,_x)<<'\n';
else cout<<query(_l,_r,_x,_y)<<'\n';
}
return 0;
}
这份代码在样例一中第一个操作输出了?(代码第30行),但是它为什么会这样呢?
为什么二分会出错呢?