1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=5e5+5; struct node { ll mx; ll sum; }tr[4*N]; int n; ll a[N]; void build(int l,int r,int p) { if(l==r) { tr[p].mx=tr[p].sum=a[l]; return; } int m=(l+r)>>1; build(l,m,p*2),build(m+1,r,p*2+1); tr[p].mx=max(tr[p*2].mx,tr[p*2+1].mx); tr[p].sum=tr[p*2].sum+tr[p*2+1].sum; } ll qsum(int ql,int qr,int l,int r,int p) { if(ql<=l&&qr>=r) return tr[p].sum; ll ans=0; int m=(l+r)>>1; if(ql<=m) ans+=qsum(ql,qr,l,m,p*2); if(qr>m) ans+=qsum(ql,qr,m+1,r,p*2+1); return ans; } int qlmx(int x,ll k,int l,int r,int p) { if(l==r) return tr[p].mx>=k?l:-1; int m=(l+r)>>1; int ans=-1; if(x>m) { if(tr[p*2+1].mx>=k) ans=qlmx(x,k,m+1,r,p*2+1); if(ans==-1&&tr[p*2].mx>=k) ans=qlmx(x,k,l,m,p*2); } else if(tr[p*2].mx>=k) ans=qlmx(x,k,l,m,p*2); return ans; } int qrmx(int x,ll k,int l,int r,int p) { if(l==r) return tr[p].mx>=k?l:-1; int m=(l+r)>>1; int ans=-1; if(x<=m) { if(tr[p*2].mx>=k) ans=qrmx(x,k,l,m,p*2); if(ans==-1&&tr[p*2+1].mx>=k) ans=qrmx(x,k,m+1,r,p*2+1); } else if(tr[p*2+1].mx>=k) ans=qrmx(x,k,m+1,r,p*2+1); return ans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; a[0]=a[n+1]=1e18; build(0,n+1,1); for(int i=1;i<=n;i++) { ll ans=a[i]; for(int l=i,r=i;;) { int ql=qlmx(l-1,ans,0,n+1,1),qr=qrmx(r+1,ans,0,n+1,1); if(ql==l-1&&qr==r+1) break; if(ql<l-1) ans+=qsum(ql+1,l-1,0,n+1,1); if(qr>r+1) ans+=qsum(r+1,qr-1,0,n+1,1); l=ql+1,r=qr-1; } cout<<ans<<' '; } return 0; }
|