运行到find_euler函数时炸了
#include<iostream>
#include<cstdio>
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
#define ll long long
#define euler eu
using namespace std;
const int N=5e5+10,M=2e7+10;
int n,m;
ll g[N<<2],d[N<<2];
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
return x*f;
}
inline void pushup(int x){g[x]=g[x<<1]+g[x<<1|1];}
inline void build(int x,int l,int r)
{
if(l==r)
{
g[x]=read();
return;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
pushup(x);
}
inline void andd(int x,int l,int r,int dd){d[x]=dd,g[x]+=(r-l+1)*dd;}
inline void pushdown(int x,int l,int r,int mid)
{
if(!d[x]) return;
andd(lson,d[x]);
andd(rson,d[x]);
d[x]=0;
}
inline void update(int x,int l,int r,int ql,int qr,int k)
{
if(ql>r||qr<l) return;
if(ql<=l&&r<=qr)
{
d[x]+=k,g[x]+=(r-l+1)*k;
return;
}
int mid=(l+r)>>1;
pushdown(x,l,r,mid);
update(lson,ql,qr,k);
update(rson,ql,qr,k);
pushup(x);
}
inline ll query(int x,int l,int r,int ql,int qr)
{
if(ql>r||qr<l) return 0;
if(ql<=l&&r<=qr) return g[x];
int mid=(l+r)>>1;
pushdown(x,l,r,mid);
return query(lson,ql,qr)+query(rson,ql,qr);
}
bool flag=false;
inline ll ksm(ll a,ll b,ll p)
{
ll res=1;
while(b)
{
if(b) res*=a;
a*=a,b>>=1;
if(a>=p) flag=true,a%=p;
if(res>=p) flag=true,res%=p;
}
return res;
}
int is_prime[N],prime[M],eu[N],t;
inline void find_euler()
{
is_prime[1]=1;
for(register int i=2;i<=M;i++)
{
if(!is_prime[i]) prime[++t]=i,eu[i]=i-1;
for(register int j=1;j<=t&&i*prime[j]<=M;j++)
{
is_prime[i*prime[j]]=1;
if(i%prime[j]) eu[i*prime[j]]=eu[i]*eu[prime[j]];
else
{
eu[i*prime[j]]=eu[i]*prime[j];
break;
}
}
}
}
inline ll solve(int l,int r,int t)
{
if(l==r) return query(1,1,n,r,r);
if(t==1) return 0;
int ans=solve(l+1,r,eu[t]);
if(!flag&&ans<eu[t]) return ksm(query(1,1,n,l,l),ans,t);
else
{
flag=false;
return ksm(query(1,1,n,l,l),ans%eu[t]+eu[t],t);
}
}
signed main()
{
n=read(),m=read();
build(1,1,n);
find_euler();
while(m--)
{
int opp=read(),l=read(),r=read(),x=read();
if(opp==1) update(1,1,n,l,r,x);
else printf("%lld\n",solve(l,r,x));
}
return 0;
}