rt,88pts拿到了,特殊输入方式死活调不出来。
#include <bits/stdc++.h>
using namespace std;
int n,type,a[40000010],qs[40000010],pre[40000010],h=1,t=0;
long long s[40000010],qt[40000010];
__int128 ans;
void print(__int128 x)
{
if(x>9)print(x/10);
putchar(x%10+'0');
}
int main()
{
scanf("%d%d",&n,&type);
if(type==0)
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
else if(type==1)
{
long long x,y,z,m,p,l,r,las=0;
scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&z,&a[1],&a[2],&m);
for(int i=3;i<=n;i++)a[i]=(int)(((x*(long long)a[i-1]%(1<<31)+y*(long long)a[i-2]%(1<<31))%(1<<31)+z)%(1<<31));
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&p,&l,&r);
las++;
for(int j=las;j<=p;j++,las++)a[j]=(a[j]%(r-l+1))+l;
}
}
for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
qs[++t]=0,qt[t]=0;
for(int i=1;i<=n;i++)
{
while(h<=t&&s[i]>=qt[h])h++;
h--,pre[i]=qs[h];
while(h<=t&&(s[i]-s[qs[h]])+s[i]<=qt[t])t--;
qs[++t]=i,qt[t]=(s[i]-s[qs[h]])+s[i];
}
while(n)ans+=(__int128)(s[n]-s[pre[n]])*(__int128)(s[n]-s[pre[n]]),n=pre[n];
print(ans);
return 0;
}