Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define pii pair<int,int>
- #define ll long long int
- #define f first
- #define s second
- using namespace std;const ll identity = -10000000000; ll dp[3000005];
- ll tree[12*100000];
- void update(int s,int e,int idx,int node,ll val){
- if(s>idx||e<idx)
- return;
- if(s==e){
- tree[node]=val;
- dp[idx]=val;
- return ;
- }
- ll m=s+e;
- m=m>>1;
- if(idx>=s&&idx<=m){update(s,m,idx, 2*node,val);
- }
- if(idx<=e&&idx>m){
- update(m+1,e,idx,2*node+1,val);
- }
- tree[node]=max(tree[2*node],tree[2*node+1]);
- }
- ll query(int s,int e,int l,int r,int node){
- if(s>r||e<l)
- return identity;
- if(s>=l&&e<=r){
- return tree[node];
- }
- ll m=s+e;
- m=m>>1;
- ll p1=query(s,m,l,r,2*node);
- ll p2=query(m+1,e,l,r,2*node+1);
- return max(p1,p2);
- }ll n,h[3000000],b[3000000],ind[3000000];
- int main(){
- cin>>n;
- for(int i=0;i<n;i++){
- cin>>h[i];
- dp[i]=identity;
- }
- for(int i=0;i<3*n;i++){
- tree[i]=identity;
- }
- for(int i=0;i<n;i++){
- cin>>b[i]; dp[i]=identity;
- }
- dp[0]=b[0];
- stack<pii> S;
- for(int i=0;i<n;i++){
- while(!S.empty()&& S.top().f>=h[i]){
- S.pop();
- }
- if(i!=0){
- if(!S.empty())
- {
- ll x=query(0,n-1,S.top().s,i,1);
- dp[i]=max(dp[i],x+b[i]);
- dp[i]=max(dp[i],dp[S.top().s-1]+b[S.top().s]);
- dp[i]=max(dp[i],dp[S.top().s]);
- }
- else{
- ll x=query(0,n-1,0,i,1);
- dp[i]=max(dp[i],x+b[i]);
- dp[i]=max(dp[i],b[i]);
- }
- }
- update(0,n-1,i, 1,dp[i]);
- S.push({h[i],i});
- }
- cout<<dp[n-1];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement