#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a), end(a)
using ll = long long;
using vi = vector<int>;
using ar2 = array<int,2>;
const int mxN = (int)1e5+10;
const ll MOD = (ll)1e9+7;
ll n, x;
ll h[mxN], pr[mxN];
vector<array<ll,2>> v;
ll pick12(ll x){ x%=MOD; return (x*(x+1)/2)%MOD; }
int main(){
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n; ll ans = 0; set<pair<ll,ll>> S;
for(int i = 0; i < n; i++) cin >> h[i];
for(int i = 0; i < n; i++){
cin >> x, v.pb({h[i],x});
pr[i+1] = (pr[i]+x)%MOD;
}
vi ind(n,0); iota(all(ind),0);
sort(all(ind),[&](int i, int j){ return h[i]>h[j]; });
for(auto i : ind){
auto it = S.lower_bound({i,-1});
auto it2 = S.lower_bound({i,-1});
bool le = 0, ri = 0; ll H = h[i];
if(it!=begin(S)) it--,le=(it->second==i-1);
if(it2!=end(S)) ri=(it2->first==i+1);
int nL=i, nR=i;
if(le) nL = it->first;
if(ri) nR = it2->second;
if(ri){
ll totW = (pr[nR+1]-pr[i+1]+MOD)%MOD;
S.erase(*it2);
ans-=(pick12(totW)*pick12(H))%MOD;
ans+=MOD; ans%=MOD;
}
if(le){
ll totW = (pr[i]-pr[nL]+MOD)%MOD;
S.erase(*it);
ans-=(pick12(totW)*pick12(H))%MOD;
ans+=MOD; ans%=MOD;
}
ll totW = (pr[nR+1]-pr[nL]+MOD)%MOD;
S.insert({nL,nR});
ans+=(pick12(totW)*pick12(H))%MOD;
ans%=MOD;
}
cout << ans << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |