如下代码在 CF896C 这道题目中WA了#3,系统提示说Fast_Pow函数出现整型溢出,但是我加了define呀
求助各位大佬
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<set>
#define IT set<Node>::iterator
#define VT vector<pair<int,int> >::iterator
#define int long long
using namespace std;
const int N=1e5+50;
const int MOD=1e9+7;
struct Node{
int l,r;
mutable int v;
Node(int L=-1,int R=-1,int V=0): l(L),r(R),v(V) {}
bool operator<(const Node& a)const {
return l<a.l;
}
};
set<Node> st;
int n,m,seed,vmax;
void Swap(int &x,int &y){int t=x;x=y;y=t;}
inline int Read()
{
char ch=getchar();
int x=0,f=1;
while(ch>'9'||ch<'0'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
int Fast_Pow(int a,int b,int p)
{
int ans=1,base=a;
while(b){
if(b&1) ans*=base,ans%=p;
base*=base;
base%=p;
b>>=1;
}
return ans;
}
IT Split(int pos)
{
IT it=st.lower_bound(Node(pos));
if(it!=st.end()&&it->l==pos) return it;
it--;
int L=it->l,R=it->r,V=it->v;
st.erase(it);
st.insert(Node(L,pos-1,V));
return st.insert(Node(pos,R,V)).first;
}
void Assign(int l,int r,int v)
{
IT itr=Split(r+1);
IT itl=Split(l);
st.erase(itl,itr);
st.insert(Node(l,r,v));
}
void Add(int l,int r,int val)
{
IT itr=Split(r+1);
IT itl=Split(l);
for(IT it=itl;it!=itr;it++) it->v+=val;
}
int Rank(int l,int r,int k)
{
IT itr=Split(r+1);
IT itl=Split(l);
vector<pair<int,int> > vet;
vet.clear();
for(IT it=itl;it!=itr;it++){
vet.push_back(make_pair(it->v,it->r-it->l+1));
}
sort(vet.begin(),vet.end());
VT vt=vet.begin();
for(int i=0;i<vet.size();i++){
k-=vet[i].second;
if(k<=0) return vet[i].first;
}
return -1;
}
int Make_Pow(int l,int r,int x,int y)
{
IT itr=Split(r+1);
IT itl=Split(l);
int ans=0;
for(IT it=itl;it!=itr;it++){
ans+=(it->r-it->l+1)*Fast_Pow(it->v,x,y)%y;
ans%=y;
}
return ans;
}
int rnd()
{
int ret=seed;
seed=(seed*7+13)%MOD;
return ret;
}
signed main()
{
n=Read(),m=Read(),seed=Read(),vmax=Read();
for(int i=1;i<=n;i++){
int a=rnd()%vmax+1;
st.insert(Node(i,i,a));
}
st.insert(Node(n+1,n+1,0));
for(int i=1;i<=m;i++){
int l,r,x,y;
int 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);
else if(op==2) Assign(l,r,x);
else if(op==3) printf("%lld\n",Rank(l,r,x));
else if(op==4) printf("%lld\n",Make_Pow(l,r,x,y));
}
return 0;
}