# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1255928 | pasta | Factories (JOI14_factories) | C++20 | 0 ms | 0 KiB |
#include "secret.h"
const int maxn = 1000 + 10;
int n, a[maxn], dp[maxn][maxn];
bool find[maxn][maxn];
void get(int l, int r) {
if (l == r)
return;
int m = (l + r) / 2;
get(l, m);
get(m + 1, r);
for (int i = m - 1; i >= l; i--) {
dp[i][m] = secret(a[i], dp[i + 1][m]);
find[i][m] = true;
}
for (int i = m + 2; i <= r; i++) {
dp[m + 1][i] = secret(a[i], dp[m + 1][i - 1]);
find[m + 1][i] = true;
}
}
void Init(int N, int A[]) {
n = N;
for (int i = 0; i < N; i++)
a[i] = A[i];
for (int i = 0; i < N; i++) {
dp[i][i] = a[i];
find[i][i] = true;
}
}
int Query(int L, int R) {
if (find[l][r])
return dp[l][r];
for (int m = l; m < r; m++) {
if (find[l][m] && find[m + 1][r]) {
return secret(dp[l][m], dp[m + 1][r]);
}
}
}