Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef vector<ll> vi;
- typedef pair<ll,ll> pi;
- typedef vector<pi> vpi;
- typedef long double ld;
- #define pb emplace_back
- #define mp make_pair
- #define lb lower_bound
- #define ub upper_bound
- #define ALL(x) x.begin(), x.end()
- #define SZ(x) (ll)x.size()
- #define f first
- #define s second
- #define MAXN 500100
- ll N,a,ans;
- ll A[MAXN], B[MAXN];
- deque<pi> dq;
- pi V[MAXN];
- pi V2[MAXN];
- ll out[MAXN];
- ll coeff[MAXN];
- ll left_vals[MAXN];
- vi des;
- struct node{
- ll s,e,m,v;
- node *l, *r;
- node (ll _s, ll _e): s(_s), e(_e), v(A[s]), m((_s + _e)/2){
- if (s != e){
- l = new node(s,m);
- r = new node(m+1,e);
- v = max(l->v, r->v);
- }
- }
- ll query(ll x,ll val) {
- if(v<val) return -1;
- if(s==e) return s;
- if(s==x) {
- if(l->v > val) return l->query(x,val);
- else return r->query(m+1,val);
- }
- if(x>m) return r->query(x,val);
- else {
- ll lp=l->query(x,val);
- if(lp != -1) return lp; else return r->query(m+1,val);
- }
- }
- }*root;
- struct n2{
- ll s,e,m,v,sum,lazy,tot;
- n2 *l, *r;
- n2 (ll _s, ll _e): s(_s), e(_e), v(A[s]), sum(0), tot(0), lazy(0), m((_s + _e)/2){
- if (s != e){
- l = new n2(s,m);
- r = new n2(m+1,e);
- tot = l->tot + r->tot;
- sum = l->sum + r->sum;
- }
- }
- void update_range(ll x, ll y, ll val){
- if (s == x && e == y){lazy = val;return;}
- prop();
- if (y <= m)l->update_range(x,y,val);
- else if (x > m)r->update_range(x,y,val);
- else {l->update_range(x,m,val); r->update_range(m+1,y,val);}
- l->prop(); r->prop();
- tot = l->tot + r->tot;
- sum = l->sum + r->sum;
- }
- void update_coeff(ll x, ll val){
- prop();
- if (s == e){
- sum = val;
- if (lazy != 0)tot = lazy*val;
- else tot = left_vals[s]*val;
- return;
- }
- if (x <= m)l->update_coeff(x,val);
- else r->update_coeff(x,val);
- l->prop();r->prop();
- tot = l->tot + r->tot;
- sum = l->sum + r->sum;
- }
- void prop(){
- if (lazy == 0)return;
- tot = sum * lazy;
- if (s == e)return;
- l->lazy = r-> lazy = lazy;
- r->lazy = lazy;
- lazy = 0;
- }
- }*r2;
- int main(){
- ios_base::sync_with_stdio(0);cin.tie(0);
- cin>>N;
- for (ll i=1;i<=N;++i)cin>>A[i];
- A[N+1] = 1e9;
- dq.pb(0,1e9);
- for (ll i=1;i<=N;++i){
- while (SZ(dq) > 1 && dq.back().s < A[i]){
- V[dq[SZ(dq) - 1].f] = mp(dq[SZ(dq) - 2].f,i);
- dq.pop_back();
- }
- dq.pb(i,A[i]);
- }
- for (;SZ(dq) > 1;dq.pop_back())V[dq[SZ(dq) - 1].f] = mp(dq[SZ(dq) - 2].f,N+1);
- for (ll i=1;i<=N;++i){
- cin>>B[i];
- B[i] += A[i];
- }
- for (ll i=1;i<=N;++i){
- while (SZ(dq) > 1 && dq.back().s < B[i]){
- V2[dq[SZ(dq) - 1].f] = mp(dq[SZ(dq) - 2].f,i);
- dq.pop_back();
- }
- dq.pb(i,B[i]);
- }
- for (;SZ(dq)>1;dq.pop_back())V2[dq[SZ(dq) - 1].f] = mp(dq[SZ(dq) - 2].f,N+1);
- root = new node(1,N+1);
- for (ll i=1;i<=N;++i){
- ll llen = i - V2[i].f;
- ll final_right = V2[i].s;
- ll original_right = root->query(i+1, B[i]);
- ll original_value = (original_right - i) * llen * B[i];
- ll final_value = (final_right - i) * llen * B[i];
- out[final_right] += final_value - original_value;
- out[i] += original_value;
- out[i] += out[i-1];
- }
- vector<pair<pi, pi>> include_coefficient;
- for (ll i=1;i<=N;++i)des.pb(A[i]);
- sort(ALL(des));
- ll cur = 0;
- for (ll i=1;i<=N;++i){
- ll seg_ind = lb(ALL(des), A[i]) - des.begin() + 1;
- ll rlen = V[i].s - i;
- ll inital_left = V[i].f;
- ll original_value = A[i] * (i - inital_left) * rlen;
- ll changed_value = A[i] * i * rlen;
- cur += original_value;
- left_vals[seg_ind] = inital_left;
- include_coefficient.pb(mp(mp(inital_left, changed_value - original_value), mp(seg_ind, A[i] * rlen)));
- pair<pi,pi> t = include_coefficient.back();
- coeff[i] = changed_value;
- }
- sort(ALL(include_coefficient));reverse(ALL(include_coefficient));
- r2 = new n2(1,N);
- out[0] = cur;
- for (ll i=1;i<=N;++i){
- ll seg_ind = lb(ALL(des), A[i]) - des.begin() + 1;
- while (SZ(include_coefficient) && include_coefficient.back().f.f == i-1){
- pair<pi,pi> t = include_coefficient.back();
- cur += t.f.s;
- r2->update_coeff(t.s.f, t.s.s);
- r2->update_range(t.s.f, t.s.f, t.f.f);
- include_coefficient.pop_back();
- }
- ll update_des = lb(ALL(des), B[i]) - des.begin();
- if (update_des > N)update_des=N;
- if (update_des >= 1)r2->update_range(1,update_des,i);
- r2->update_coeff(seg_ind,0);
- cur -= coeff[i];
- r2->prop(); out[i] += cur - r2->tot;
- }
- for (ll i=0;i<=N;++i)cout<<out[i]<<'\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement