#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<int> A(2005), B(2005);
struct node {
node *lc, *rc;
int l, r, m, v;
long long dv = 0;
node(int S, int E) {
l = S;
r = E;
m = (l + r) / 2;
if (l == r) {
v = A[l];
} else {
lc = new node(l, m);
rc = new node(m + 1, r);
v = min(lc -> v, rc -> v);
}
}
int query(int S, int E) {
if (l == S && r == E) return v + dv;
if (E <= m) return lc -> query(S, E) + dv;
if (S > m) return rc -> query(S, E) + dv;
return min(lc -> query(S, m), rc -> query(m + 1, E)) + dv;
}
void update(int S, int E, int D) {
int total;
if (l == S && r == E) {
dv += D;
return;
}
else if (E <= m) lc -> update(S, E, D);
else if (S > m) rc -> update(S, E, D);
else {
lc -> update(S, m, D);
rc -> update(m + 1, E, D);
}
v = min(lc -> v + lc -> dv, rc -> v + rc -> dv);
}
} *root1, *root2;
signed main() {
int N, M = 0;
cin >> N;
for (int i = 0; i < N; i++) cin >> A[i] >> B[i];
root1 = new node(0, N);
A = B;
root2 = new node(0, N);
for (int i = 0; i < N; i++) {
for (int j = i; j < N; j++) {
M = max(M, root1 -> query(i, j) * root2 -> query(i, j) * (j - i + 1));
}
}
cout << M;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |