CodeForces上交的,显示第 6 个点寄了。
蒟蒻第一次用 CodeForces,有点不会用,不明白 CodeForces 返回 “Probably, the solution is executed with error 'signed integer overflow' on the line 43”是啥意思,还请大佬指点一下,谢谢。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
struct node{
int l,r;
mutable int v;
};
typedef set<node>::iterator sti;
bool operator<(node a,node b){
return a.l<b.l;
}
set<node>s;
int a[N],n,m,seed,mod,op,l,r,x,y;
int rnd(){
int ret=seed;
seed=(seed*7+13)%1000000007;
return ret;
}
sti split(int pos){
sti k=s.lower_bound(node{pos,0,0});
if(k!=s.end()&&k->l==pos)return k;
k--;
int l=k->l,r=k->r,v=k->v;
s.erase(k);
s.insert(node{l,pos-1,v});
return s.insert(node{pos,r,v}).first;
}
void add(int l,int r,int k){
sti re=split(r+1);
sti le=split(l);
for(sti i=le;i!=re;i++)
i->v+=k;
}
void merge(int l,int r,int k){
sti re=split(r+1);
sti le=split(l);
s.erase(le,re);
s.insert(node{l,r,k});
}
int qpow(int x,int y,int m){
if(y==0)return 1;
if(y&1)return x*qpow(x,y-1,m)%m;//这一行(43行)被标红了
else{
int k=qpow(x,y>>1,m);
return k*k%m;
}
}
int ask(int l,int r,int x){
sti re=split(r+1);
sti le=split(l);
map<int,int>mp;
for(sti i=le;i!=re;i++)
mp[i->v]+=(i->r)-(i->l)+1;
int cnt=0;
for(auto i:mp){
cnt+=i.second;
if(cnt>=x)return i.first;
}
}
int powsum(int l,int r,int x,int y){
sti re=split(r+1);
sti le=split(l);
int ans=0;
for(sti i=le;i!=re;i++)
ans=(ans+qpow(i->v,x,y)*((i->r)-(i->l)+1)%y)%y;
return ans;
}
signed main(){
cin>>n>>m>>seed>>mod;
for(int i=1;i<=n;i++){
a[i]=rnd()%mod+1;
s.insert(node{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()%mod+1;
if(op==4)y=rnd()%mod+1;
if(op==1)add(l,r,x);
if(op==2)merge(l,r,x);
if(op==3)cout<<ask(l,r,x)<<'\n';
if(op==4)cout<<powsum(l,r,x,y)<<'\n';
}
return 0;
}