only WrongAnswer on #4 Subtask #1
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 3e3 + 5;
int n, m, dp[maxn][maxn][2], len = 1, now;
ll ans;
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) for (int j = 1; j <= i; ++j) scanf("%d", &dp[i][j][0]);
while ((len << 1) < m) {
len <<= 1;
for (int i = 1; i + len - 1 <= n; ++i) for (int j = 1; j <= i; ++j)
dp[i][j][now ^ 1] = max({dp[i][j][now], dp[i + (len >> 1)][j][now], dp[i + (len >> 1)][j + (len >> 1)][now], dp[i + (len >> 2)][j][now], dp[i + (len >> 2)][j + (len >> 2)][now], dp[i + (len >> 1)][j + (len >> 2)][now]});
now ^= 1;
}
for (int i = 1; i + m - 1 <= n; ++i) for (int j = 1; j <= i; ++j)
ans += max({dp[i][j][now], dp[i + m - len][j][now], dp[i + m - len][j + m - len][now], dp[i + ((m - len) >> 2)][j][now], dp[i + ((m - len) >> 2)][j + ((m - len) >> 2)][now], dp[i + m - len][j + ((m - len) >> 2)][now]});
printf("%lld", ans);
return 0;
}