想用int128水过去,结果交上去疯狂CE(
#include<stdio.h>
const int maxn=40000005;
const long long mod=1073741824;
int i,j,k,m,n,hd,tl,xx,yy,zz;
int w[maxn],q[maxn],bb[maxn],pp[maxn],ll[maxn],rr[maxn];
__int128 f[maxn],sum[maxn],rec[maxn];
void write(__int128 x){
if(x>9)
write(x/(__int128)10);
putchar(x%(__int128)10+48);
}
int main(){
scanf("%d%d",&n,&k);
if(k==1){
scanf("%d%d%d%d%d%d",&xx,&yy,&zz,&bb[1],&bb[2],&m);
for(i=3;i<=n;i++)
bb[i]=(int)((1ll*xx*bb[i-1]+1ll*yy*bb[i-2]+1ll*zz)%mod);
for(i=1;i<=m;i++){
scanf("%d%d%d",&pp[i],&ll[i],&rr[i]);
for(j=pp[i-1]+1;j<=pp[i];j++)
w[j]=(bb[j]%(rr[i]-ll[i]+1))+ll[i];
}
}
else for(i=1;i<=n;i++)
scanf("%d",&w[i]);
for(i=1;i<=n;i++)
sum[i]=sum[i-1]+(__int128)w[i];
hd=1,tl=0;
for(i=1;i<=n;i++){
while(hd<=tl&&sum[i]-sum[q[hd]]>=rec[q[hd]])
hd++;
rec[i]=sum[i]-sum[q[hd-1]],f[i]=f[q[hd-1]]+rec[i]*rec[i];
while(hd<=tl&&rec[i]+sum[i]<=rec[q[tl]]+sum[q[tl]])
tl--;
q[++tl]=i;
}
write(f[n]);
return 0;
}