#include using namespace std; #define all(x) (x).begin(), (x).end() #define sz(x) (int) (x).size() typedef long long lint; typedef pair ii; int n; lint A[500005], B[500005]; lint ans[500005]; void add(int l, int r, lint val){ ans[l] += val; ans[r+1] -= val; } struct sumtool{ lint total = 0; vector v, psum; void push(lint x){ if(v.empty()) v.push_back(x); else v.push_back(max(v.back(), x)); total += v.back(); psum.push_back(total); } lint query(lint x){ int pos = upper_bound(all(v), x) - v.begin(); lint res = total; if(pos != 0) res -= psum[pos-1]; res += x * pos; return res; } }; struct thing{ lint val, total, cnt; }; lint val[500005], total[500005], tempans[500005]; void dnc(int l, int r){ if(l == r){ add(0, l-1, A[l]); add(l, n, B[l]); return; } lint res = 0; int m = (l+r)/2; ///compute for [l, m] first sumtool R; for(int i = m+1;i <= r;i++) R.push(A[i]); lint acc = 0; for(int i = m;i >= l;i--){ acc = max(acc, A[i]); val[i] = acc; total[i] = R.query(acc); res += total[i]; } tempans[l-1] = res; stack S; for(int i = l;i <= m;i++){ res -= total[i]; val[i] = max(val[i], B[i]); int cnt = 1; while(!S.empty()){ if(S.top().val <= val[i]){ cnt += S.top().cnt; res -= S.top().total * S.top().cnt; S.pop(); } else break; } lint total = R.query(val[i]); res += total * cnt; S.push({val[i], total, cnt}); tempans[i] = res; } ///compute for [m+1, R] first sumtool L; while(!S.empty()) S.pop(); for(int i = m;i >= l;i--) L.push(B[i]); acc = 0, res = 0; for(int i = m+1;i <= r;i++){ acc = max(acc, A[i]); val[i] = acc; total[i] = L.query(acc); res += total[i]; } for(int i = r;i >= m+1;i--){ if(S.empty() || S.top().val > val[i]) S.push({val[i], total[i], 1}); else S.top().cnt++; } for(int i = m+1;i <= r;i++){ res -= S.top().total; if(S.top().cnt == 1) S.pop(); else S.top().cnt--; val[i] = max(val[i], B[i]); if(i != m+1) val[i] = max(val[i], val[i-1]); int cnt = 1; while(!S.empty()){ if(S.top().val <= val[i]){ cnt += S.top().cnt; res -= S.top().total * S.top().cnt; S.pop(); } else break; } lint total = L.query(val[i]); res += total * cnt; S.push({val[i], total, cnt}); tempans[i] = res; if(S.top().cnt == 1) S.pop(); else S.top().cnt--; } add(0, l-1, tempans[l-1]); add(r, n, tempans[r]); for(int i = l;i < r;i++) add(i, i, tempans[i]); dnc(l, m); dnc(m+1, r); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; for(int i = 1;i <= n;i++) cin >> A[i]; for(int i = 1;i <= n;i++) cin >> B[i], B[i] += A[i]; dnc(1, n); lint acc = 0; for(int i = 0;i <= n;i++){ acc += ans[i]; cout << acc << "\n"; } }