不知道是写错了还是常数丑了,求大佬帮忙看看。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<utility>
#include<bitset>
#include<cstdio>
#include<string>
#include<time.h>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef unsigned long long ull;
typedef __uint128_t L;
struct FastMod {
ull b, m;
FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
ull reduce(ull a) {
ull q = (ull)((L(m) * a) >> 64);
ull r = a - q * b;
return r >= b ? r - b : r;
}
};
FastMod F(2);
const int N=1e6+5,M=2e4;
int a[N],w[N],b,h[N],t[N],d,S,T;
long long g[M],e[M],an[N],s[M];
struct query{
int l,r,f,b;
long long p;
}q[N];
char bu[1<<24];
inline char get()
{
if(S==T)
{
S=0;
T=fread(bu,1,1<<24,stdin);
if(S==T)
return EOF;
}
return bu[S++];
}
int read()
{
int x=0;
char c;
do
c=get();
while(c<'0'||'9'<c);
while('0'<=c&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=get();
}
return x;
}
bool cmp(query x,query y)
{
if(x.f==y.f)
{
if(x.f&1)
return x.r>y.r;
return x.r<y.r;
}
return x.f<y.f;
}
void move(int x,bool v)
{
if(w[a[x]]>b)
{
t[h[a[x]]]=t[a[x]];
h[t[a[x]]]=h[a[x]];
if(d==a[x])
d=t[a[x]];
}
else
s[w[a[x]]]-=a[x];
if(v)
w[a[x]]++;
else
w[a[x]]--;
if(w[a[x]]>b)
{
t[a[x]]=d;
h[d]=a[x];
d=a[x];
}
else
s[w[a[x]]]+=a[x];
}
long long em(int x)
{
return F.reduce(g[x/b]*e[x%b]);
}
int main()
{
int n,m,l,r;
n=read(),m=read();
for(int i=0;i<n;i++)
a[i]=read();
b=2*sqrt((double)n);
for(int i=1;i<=m;i++)
{
q[i].l=read(),q[i].r=read(),q[i].p=read();
q[i].l--,q[i].r--;
q[i].f=q[i].l/b;
q[i].b=i;
}
sort(q+1,q+m+1,cmp);
l=q[1].l,r=q[1].l-1;
for(int i=1;i<=m;i++)
{
while(l>q[i].l)
move(--l,1);
while(r>q[i].r)
move(r--,0);
while(r<q[i].r)
move(++r,1);
while(l<q[i].l)
move(l++,0);
e[0]=1;
for(int j=0;j<b;j++)
{
e[j+1]=e[j]<<1;
if(e[j+1]>q[i].p)
e[j+1]-=q[i].p;
}
g[0]=1;
if(q[i].p==1)
an[q[i].b]=0;
else
{
F=FastMod(q[i].p);
for(int j=0;b*(j+1)<=n;j++)
g[j+1]=F.reduce(g[j]*e[b]);
for(int j=1;j<=b;j++)
an[q[i].b]=F.reduce(an[q[i].b]+s[j]*(q[i].p+em(r-l+1)-em(r-l+1-j)));
for(int j=d;j;j=t[j])
an[q[i].b]=F.reduce(an[q[i].b]+j*(q[i].p+em(r-l+1)-em(r-l+1-w[j])));
}
}
for(int i=1;i<=m;i++)
printf("%d\n",(int)an[i]);
}