Submission #1189345

#TimeUsernameProblemLanguageResultExecution timeMemory
1189345JooDdae케이크 (JOI13_cake)C++20
100 / 100
513 ms76400 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define mid ((l+r) >> 1)

struct block {
	ll s[2];
	int sz, L, R;
	block operator + (const block &a) const {
		int c = a.sz % 2;
		return {{s[c]+a.s[0], s[!c]+a.s[1]}, sz+a.sz, L, a.R};
	}
} o, t[1200120];

int n, a[300300], b[300300], r[300300];
ll ans[300300];

void update(int id, block &x, int node = 1, int l = 1, int r = n) {
	if(id < l || r < id) return;
	if(l == r) {
		t[node] = x;
		return;
	}
	update(id, x, node*2, l, mid), update(id, x, node*2+1, mid+1, r);
	t[node] = t[node*2] + t[node*2+1];
}

block find(int nl, int nr, int node = 1, int l = 1, int r = n) {
	if(r < nl || nr < l) return o;
	if(nl <= l && r <= nr) return t[node];
	return find(nl, nr, node*2, l, mid) + find(nl, nr, node*2+1, mid+1, r);
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin >> n;
	for(int i=1;i<=n;i++) cin >> a[i];
	iota(r+1, r+1+n, 1);
	sort(r+1, r+1+n, [&](auto x, auto y){ return a[x] < a[y]; });
	for(int i=1;i<=n;i++) b[r[i]] = i;

	int mn = r[1];
	rotate(a+1, a+mn, a+1+n), rotate(b+1, b+mn, b+1+n);
	
	ans[1] = a[1];
	for(int i=2, L = 2, R = n;i<=n;i++) {
		int C = a[L] > a[R] ? a[L++] : a[R--];
		if(i % 2) ans[1] += C;
	}

	vector<vector<block>> op(n+1);
	vector<block> st(1, o);
	for(int i=n;i>1;i--) {
		block u = {{a[i], 0}, 1, b[i], b[i]};
		while(st.back().L > b[i]) {
			auto P = st.back(); st.pop_back();
			op[i].push_back(P);
			update(P.L, o);
			int c = u.sz % 2;
			u.s[0] += P.s[c], u.s[1] += P.s[!c];
			u.sz += P.sz, u.R = P.R;
		}
		update(b[i], u);
		st.push_back(u);
	}

	st = {o};
	for(int i=2;i<=n;i++) {
		update(b[i], o);
		for(auto B : op[i]) update(B.L, B);
		
		ans[i] = t[1].s[1] + a[i] + (n%2 ? a[1] : 0);
		
		block u = {{a[i], 0}, 1, b[i], b[i]};
		while(st.back().R > b[i]) {
			auto P = st.back(); st.pop_back();
			update(P.R, o);
			int c = u.sz % 2;
			u.s[0] += P.s[c], u.s[1] += P.s[!c];
			u.sz += P.sz, u.L = P.L;
		}
		update(b[i], u);
		st.push_back(u);
	}

	for(int i=0;i<n;i++) cout << ans[(i-mn+1+n)%n+1] << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...