RT,看编译信息应该是数组开大了,但我算了一下只有 112 MB 啊(而且还是往上咕的)
code:
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using Pll = pair<LL, int>;
const int kMaxN = 1e6 + 5, kL = 21;
int f[kL][kMaxN], d[kMaxN], fa[kMaxN], a[kMaxN], Log[kMaxN] = {-1}, n, q;
Pll s[kMaxN] = {{-1, 1}};
LL ans, cnt;
vector<int> v[kMaxN];
int F(int x) {
return fa[x] == x ? x : fa[x] = F(fa[x]);
}
int M(int x, int y) {
return s[x].first * s[y].second > s[y].first * s[x].second ? x : y;
}
void I() {
for (int i = 1; i < kL; i++) {
for (int j = 1; j + (1 << i) - 1 < kMaxN; j++) {
f[i][j] = M(f[i - 1][j], f[i - 1][j + (1 << i)]);
}
}
}
void D(LL x, LL y, LL &l, LL &r, LL pre) {
l = (x * pre + l - 1) % n + 1;
r = (y * pre + r - 1) % n + 1;
if (l > r) {
swap(l, r);
}
}
LL Q(int l, int r) {
int x = Log[r - l + 1];
return M(f[x][l], f[x][r - (1 << x) + 1]);
}
int main() {
freopen(".out", "w", stdout);
ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
v[a[i]].push_back(i);
}
for (int i = 1; i < kMaxN; i++) {
Log[i] = Log[i / 2] + 1;
for (int p : v[i]) {
fa[p] = p, d[p] = 1;
ans++, cnt++;
if (fa[p - 1]) {
int x = F(p - 1), y = F(p);
ans += 2LL * d[x] * d[y];
fa[y] = x, d[x] += d[y];
cnt--;
}
if (fa[p + 1]) {
int x = F(p + 1), y = F(p);
ans += 2LL * d[x] * d[y];
fa[y] = x, d[x] += d[y];
cnt--;
}
}
s[i] = {ans, i};
f[0][cnt] = M(f[0][cnt], i);
}
I();
for (LL a, b, l, r, pre = 0; q; q--) {
cin >> a >> b >> l >> r;
D(a, b, l, r, pre);
LL ans = Q(l, r);
if (ans == 0) {
cout << "-1 -1\n"
<< l << " " << r << " " << pre % n << "\n";
pre = 1;
} else {
cout << s[ans].first << " " << ans << "\n"
<< l << " " << r << " " << pre % n << "\n";
pre = s[ans].first;
}
}
return 0;
}