我压位高精度实在卡不动空间了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 40000010
using namespace std;
typedef long long ll;
const ll p=1<<30,yu=1000000000;
int q[N];
ll n,m,a1,s[N],g[N],h,head=1,tail=0,b1,b2,m1,pi,l,r,x,y,z,b3,lp;
struct superlong{
ll a[5];int n;
inline void make(ll x){
n=0;memset(a,0,sizeof(a));
while(x!=0){
a[++n]=x%yu;
x/=yu;
}
}
void print(){
printf("%lld",a[n]);
for(int i=n-1;i>=1;i--)
printf("%09lld",a[i]);
printf("\n");
}
}dp[N],e;
superlong operator + (const superlong &x,const superlong &y)
{
superlong z;z.make(0);z.n=max(x.n,y.n);
for(int i=1;i<=max(x.n,y.n);i++)z.a[i]=x.a[i]+y.a[i];
for(int i=1;i<=z.n;i++)
if(z.a[i]>=yu)z.a[i==z.n?++z.n:i+1]+=z.a[i]/yu,z.a[i]%=yu;
return z;
}
superlong operator * (const superlong &x,const superlong &y)
{
superlong z;z.make(0);z.n=x.n+y.n-1;
for(int i=1;i<=x.n;i++)
for(int j=1;j<=y.n;j++)
z.a[i+j-1]+=x.a[i]*y.a[j];
for(int i=1;i<=z.n;i++)
if(z.a[i]>=yu)z.a[i==z.n?++z.n:i+1]+=z.a[i]/yu,z.a[i]%=yu;
return z;
}
int main()
{
scanf("%lld%lld",&n,&m);
if(m==0)for(int i=1;i<=n;i++)scanf("%lld",&a1),s[i]=s[i-1]+a1;
else
{
scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&z,&b1,&b2,&m1);
for(int i=1;i<=m1;i++)
{
scanf("%lld%lld%lld",&pi,&l,&r);
for(int j=lp+1;j<=pi;j++)
{
if(j>=3)
{
b3=(b2*x+b1*y+z)%p,
s[j]=s[j-1]+(b3%(r-l+1))+l,b1=b2,b2=b3;
}
else if(j==2)s[j]=s[j-1]+(b2%(r-l+1))+l;
else if(j==1)s[j]=s[j-1]+(b1%(r-l+1))+l;
}
lp=pi;
}
}
for(int i=1;i<=n;i++)dp[i].make(0);
q[++tail]=0;
for(int i=1;i<=n;i++)
{//弹完没事才能弹
while(head<tail&&s[q[head+1]]+g[q[head+1]]<=s[i])head++;
e.make(s[i]-s[q[head]]);
dp[i]=dp[q[head]]+e*e;
g[i]=s[i]-s[q[head]];
while(head<=tail&&s[q[tail]]+g[q[tail]]>=s[i]+g[i])tail--;
q[++tail]=i;//维护s[i]+g[i]单调上升供对头递增
/* for(int j=i-1;j>=0;j--)
if(s[i]-s[j]>=g[j]){dp[i]=dp[j]+1;g[i]=s[i]-s[j];break;}*/
}
dp[n].print();
return 0;
}