#include <bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn = 4e7 + 10;
const int Maxm = 1e5 + 10;
int n, opt;
int a[Maxn], b[Maxn];
int p[Maxm], L[Maxm], R[Maxm];
int sum[Maxn];
//__int128 f[Maxn];
int g[Maxn];
int pre[Maxn];
int q[Maxn];
int l, r;
int s[Maxn], top;
void write(__int128 x) {
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
signed main() {
int i, j;
scanf("%lld %lld", &n, &opt);
if (opt == 0) {
for (i = 1; i <= n; ++i) {
scanf("%lld", a + i);
sum[i] = sum[i - 1] + a[i];
}
}
else {
int x, y, z, m;
scanf("%lld %lld %lld %lld %lld %lld", &x, &y, &z, b + 1, b + 2, &m);
for (i = 1; i <= m; ++i) {
scanf("%lld %lld %lld", p + i, L + i, R + i);
}
for (i = 3; i <= n; ++i) {
b[i] = (x * b[i - 1] % (1ll << 30) + y * b[i - 2] % (1ll << 30) + z) % (1ll << 30);
}
for (i = 1; i <= m; ++i) {
for (j = p[i - 1] + 1; j <= p[i]; ++j) {
a[j] = (b[j] % (R[i] - L[i] + 1)) + L[i];
sum[j] = sum[j - 1] + a[j];
// printf("%lld %lld\n", j, sum[j]);
}
}
}
// memset(f, 0x3f, sizeof(f));
// f[0] = 0;
l = r = 1;
q[1] = 0;
// pre[++cnt] = 0;
for (i = 1; i <= n; ++i) {
while (l < r && sum[i] >= g[q[l + 1]] + sum[q[l + 1]]) ++l;
// f[i] = f[q[l]] + ((__int128)sum[i] - sum[q[l]]) * (sum[i] - sum[q[l]]);
pre[i] = q[l];
g[i] = sum[i] - sum[q[l]];
while (l <= r && g[q[r]] + sum[q[r]] >= g[i] + sum[i]) --r;
q[++r] = i;
// printf("%lld ", i);
// write(f[i]);
// puts("");
}
// write(f[n]);
int now = n;
while (1) {
s[++top] = now;
if (now == 0) break;
now = pre[now];
}
__int128 ans = 0;
while (top) {
ans = ans + ((__int128)sum[s[top]] - sum[s[top + 1]]) * (sum[s[top]] - sum[s[top + 1]]);
--top;
}
write(ans);
return 0;
}
没脸见人了,编译错误调不出来。。。
应该是数组的问题,把Maxn改成1e7就能通过编译。