最后两个点死活 MLE,感觉自己该省掉的空间都省掉了,实在不理解哪里还可以省空间了,求助 qwq
#include <bits/stdc++.h>
#define i128 __int128
#define ll long long
using namespace std;
const int N = 4e7;
const ll Mod = (1ll << 30);
int n, tp;
int que[N + 10], fr = 1, tl = 0;
ll qz[N + 10];
int l[N + 10];
i128 calc(int n) {
if(!l[n]) return (i128)qz[n] * qz[n];
else return (i128)(calc(l[n]) + (i128)(qz[n] - qz[l[n]]) * (qz[n] - qz[l[n]]));
}
void write(i128 x) {
if(!x) return ;
write(x / 10);
cout << (int)(x % 10);
}
signed main() {
// freopen("read.in", "r", stdin);
// freopen("write.out", "w", stdout);
cin >> n >> tp;
if(!tp) {
for(int i = 1; i <= n; i++) {
cin >> qz[i];
qz[i] = qz[i - 1] + qz[i];
}
}
else {
ll x, y, z, m;
int b[3];
cin >> x >> y >> z >> b[1] >> b[2] >> m;
int lastp = 1;
for(int i = 1; i <= m; i++) {
ll p, L, R;
cin >> p >> L >> R;
for(int j = lastp; j <= p; j++) {
if(j >= 3)
b[j % 3] = (x * (ll)b[(j - 1) % 3] % Mod + y * (ll)b[(j - 2) % 3] % Mod + z) % Mod;
qz[j] = ((1ll) * b[j % 3] % (R - L + 1)) + L;
}
lastp = p + 1;
}
for(int i = 1; i <= n; i++)
qz[i] = qz[i - 1] + qz[i];
}
que[++tl] = 0;
for(int i = 1; i <= n; i++) {
int j = fr;
l[i] = 0;
while(fr <= tl && 2 * qz[que[fr]] - qz[l[que[fr]]] <= qz[i]) fr++;
fr--;
l[i] = que[fr];
while(fr <= tl && 2 * qz[que[tl]] - qz[l[que[tl]]] >= 2 * qz[i] - qz[l[i]]) tl--;
que[++tl] = i;
}
write(calc(n));
}