#include #define fi first #define se second #define rep(i,s,n) for (int i = (s); i < (n); ++i) #define rrep(i,n,g) for (int i = (n)-1; i >= (g); --i) #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define len(x) (int)(x).size() #define dup(x,y) (((x)+(y)-1)/(y)) #define pb push_back #define eb emplace_back #define Field(T) vector> using namespace std; using ll = long long; using ull = unsigned long long; template using pq = priority_queue,greater>; using P = pair; templatebool chmax(T&a,T b){if(abool chmin(T&a,T b){if(b struct LazySegTree { public: LazySegTree() : LazySegTree(0) {} LazySegTree(int n) : LazySegTree(vector(n, e())) {} LazySegTree(int n, S v) : LazySegTree(vector(n, v)) {} LazySegTree(const vector& v) : _n(int(v.size())) { lg = 0; while ((1U << lg) < (unsigned int)(_n)) lg++; siz = 1 << lg; d = vector (2*siz, e()); lz = vector (siz, id()); for (int i = 0; i < _n; ++i) { d[siz+i] = v[i]; } for (int i = siz-1; i >= 1; --i) update(i); } void set(int p, S x) { assert(0 <= p && p < _n); p += siz; for (int i = lg; i >= 1; --i) push(p >> i); d[p] = x; for (int i = 1; i <= lg; ++i) update(p >> i); } S get(int p) { assert(0 <= p && p < _n); p += siz; for (int i = lg; i >= 1; --i) push(p >> i); return d[p]; } S prod(int l, int r) { assert(0 <= l && l <= r && r <= _n); if (l == r) return e(); l += siz, r += siz; for(int i = lg; i >= 1; --i) { if (((l >> i) << i) != l) push(l >> i); if (((r >> i) << i) != r) push(r >> i); } S sml = e(), smr = e(); while(l < r) { if (l & 1) sml = op(sml, d[l++]); if (r & 1) smr = op(d[--r], smr); l >>= 1, r >>= 1; } return op(sml, smr); } void apply(int l, int r, F f) { assert(0 <= l && l <= r && r <= _n); if (l == r) return; l += siz, r += siz; for (int i = lg; i >= 1; --i) { if (((l >> i) << i) != l) push(l >> i); if (((r >> i) << i) != r) push((r-1) >> i); } { int l2 = l, r2 = r; while(l < r) { if (l & 1) eval(l++, f); if (r & 1) eval(--r, f); l >>= 1, r >>= 1; } l = l2, r = r2; } for(int i = 1; i <= lg; ++i) { if (((l >> i) << i) != l) update(l >> i); if (((r >> i) << i) != r) update((r-1) >> i); } } using G = function; // max_{r \in [l, n]} f(prod(l, r)) == true int max_right(int l, G f) { assert(0 <= l && l <= _n); assert(f(e())); if (l == _n) return _n; l += siz; for (int i = lg; i >= 1; --i) { push(l >> i); } S v = e(); do { while(l % 2 == 0) l >>= 1; if (!f(op(v, d[l]))) { while(l < siz) { push(l); l *= 2; if (f(op(v, d[l]))) { v = op(v, d[l]); ++l; } } return l - siz; } v = op(v, d[l]); ++l; } while((l & -l) != l); return _n; } private: int _n, siz, lg; vector d; vector lz; void update(int k) { d[k] = op(d[2*k], d[2*k+1]); } void eval(int k, F f) { d[k] = prop(d[k], f); if (k < siz) lz[k] = merge(lz[k], f); } void push(int k) { eval(2*k, lz[k]); eval(2*k+1, lz[k]); lz[k] = id(); } }; // merge(f, g)(x) = g(f(x)) using S = ll; using F = ll; S op(S a, S b) { return max(a, b); } S e() { return 0; } S prop(S a, F f) { return a+f; } F merge(F f, F g) { return f+g; } F id() { return 0; } template struct SparseTable { vector> st; vector up; SparseTable(const vector &v) { int b = 0; while((1U << b) <= v.size()) ++b; st.assign(b, vector(1<>1] + 1; } } inline S prod(int l, int r) { if (l == r) return e(); int b = up[r-l]; return op(st[b][l], st[b][r-(1<> n; vector a(n), b(n); rep(i,0,n) cin >> a[i]; rep(i,0,n) cin >> b[i]; vector

va(n), vb(n); rep(i,0,n) va[i] = {a[i], i}, vb[i] = {b[i], i}; SparseTable sta(va), stb(vb); LazySegTree seg(n); function f = [&](int l, int r) { if (l == r) return; P p1 = sta.prod(l, r), p2 = stb.prod(l, r); if (p1.fi <= p2.fi) { seg.apply(p1.se, r, 1LL*p1.fi*(p1.se-l+1)); f(l, p1.se), f(p1.se+1, r); } else { seg.apply(p2.se, r, 1LL*p2.fi*(p2.se-l+1)); f(l, p2.se), f(p2.se+1, r); } }; f(0, n); rep(i,0,n) { cout << seg.get(i) << " "; } cout << endl; return 0; }