RT,见代码注释。请问是为什么?
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e7+10,mod=(1<<30);
int n;
bool type;
struct Node
{
int pos;
ll val;
}temp,q[N];
int a,b[4],l,r,p,pre[N];
ll sum[N];
int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-48;s=getchar();}
return x*f;
}
void write(__int128 x)
{
if(!x) return;
write(x/10);
putchar(x%10+'0');
}
int main()
{
n=read(),type=read();
if(!type)
for(int i=1;i<=n;i++)
{
a=read();
sum[i]=sum[i-1]+a;
}
else
{
int x,y,z,m;
x=read(),y=read(),z=read(),b[1]=read(),b[2]=read(),m=read();
p=read(),l=read(),r=read();
for(int i=1;i<=2;i++)
{
a=(b[i]%(r-l+1))+l;
sum[i]=sum[i-1]+a;
if(p==i) //scanf("%d%d%d",&p,&l,&r);
p=read(),l=read(),r=read();
//这个位置如果用读优,那么样例三就会超时,用scanf就不会
}
for(int i=3;i<=n;i++)
{
b[3]=(ll)((ll)x*b[2]%mod+(ll)y*b[1]%mod+z)%mod;
a=(b[3]%(r-l+1))+l;
if(i==p) //scanf("%d%d%d",&p,&l,&r);
p=read(),l=read(),r=read();
b[1]=b[2],b[2]=b[3];
sum[i]=sum[i-1]+a;
}
}
for(int i=1,last=0,l=1,r=0;i<=n;i++)
{
while(l<=r&&q[l].val<=sum[i])
{
last=q[l].pos;
l++;
}
pre[i]=last;
temp.pos=i,temp.val=sum[i]+sum[i]-sum[last];
while(l<=r&&q[r].val>=temp.val) r--;
q[++r]=temp;
}
__int128 ans=0;
int now=n;
while(now)
{
ans+=(__int128)(sum[now]-sum[pre[now]])*(sum[now]-sum[pre[now]]);
now=pre[now];
}
write(ans);
return 0;
}