// dmoj problem: https://vjudge.net/contest/805148#problem/B
#include <bits/stdc++.h>
#define int long long
#define all(x) x.begin(), x.end()
using namespace std;
int n, a[200001];
void tryinsert(int idx, int ins, vector<int> &to)
{
if (idx < to.size())
{
to[idx] = max(to[idx], ins);
}
else
{
assert(idx == to.size());
to.push_back(ins);
}
}
void join(vector<int> &a, vector<int> &b, vector<int> &out)
{
int lp = 0;
int rp = 0;
int cur = 0;
while (lp + 1 < a.size() && rp + 1 < b.size())
{
if (a[lp + 1] + b[rp] > a[lp] + b[rp + 1])
{
tryinsert(lp + rp + 1, a[lp + 1] + b[rp], out);
++lp;
}
else
{
tryinsert(lp + rp + 1, a[lp] + b[rp + 1], out);
++rp;
}
}
while (lp + 1 < a.size())
{
tryinsert(lp + rp + 1, a[lp + 1] + b[rp], out);
++lp;
}
while (rp + 1 < b.size())
{
tryinsert(lp + rp + 1, a[lp] + b[rp + 1], out);
++rp;
}
}
// _ _! !_ !!
// 00
vector<vector<int>> recurse(int l, int r)
{
if (l == r)
return {{0}, {0}, {0}, {0, a[l]}};
int m = (l + r) / 2;
auto a = recurse(l, m);
auto b = recurse(m + 1, r);
vector<vector<int>> out(4, vector<int>(1));
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if ((i & 1) && (j & 2))
continue;
join(a[i], b[j], out[(i & 2) + (j & 1)]);
}
}
return out;
}
int32_t main()
{
cin.sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
auto ret = recurse(1, n);
vector<int> out(1);
vector<int> t(1);
for (int i = 0; i < 4; i++)
{
join(ret[i], t, out);
}
for (int i = 1; i <= (n + 1) / 2; i++)
cout << out[i] << "\n";
return 0;
}