/*
Author : kmv__
muadongdenroi, emcodencungmuadongkhong :<
Road to tst
*/
#include<bits/stdc++.h>
using namespace std;
#define left(id) (id << 1)
#define right(id) ((id << 1) | 1)
#define mid(l,r) ((l + r) >> 1)
const int N = 1e5 + 5;
const int MOD = 1e9 + 7;
int n, h[N], w[N];
int l[N], r[N];
long long t[N];
struct DATA{
int id, val;
};
bool cmp(DATA A, DATA B){
return A.val < B.val;
}
vector < DATA > a;
int calc(long long len){
if (len == 0)
return 0;
__int128 res;
res = (len - 1) * len;
res /= 2;
res += len;
res %= MOD;
return (int) res;
}
long long st[N * 4], lz[N * 4];
void down(int id, int l, int r){
if (lz[id] == 0)
return;
long long x = lz[id];
lz[id] = 0;
if (l != r){
int mid = mid(l, r);
st[left(id)] = (1ll * x * (mid - l + 1)) % MOD;
st[right(id)] = (1ll * x * (r - mid)) % MOD;
lz[left(id)] = x;
lz[right(id)] = x;
}
}
void upd(int id, int l, int r, int u, int v, int val){
if (v < l || r < u)
return;
down(id, l, r);
if (u <= l && r <= v){
st[id] = (1ll * val * (r - l + 1)) % MOD;
lz[id] = val;
down(id, l, r);
return;
}
int mid = mid(l, r);
upd(left(id), l, mid, u, v, val);
upd(right(id), mid + 1, r, u, v, val);
st[id] = (st[left(id)] + st[right(id)]) % MOD;
}
long long Get(int id, int l, int r, int u, int v){
if (v < l || r < u)
return 0;
down(id, l, r);
if (u <= l && r <= v)
return st[id];
int mid = mid(l, r);
return (Get(left(id), l, mid, u, v) + Get(right(id), mid + 1, r, u, v)) % MOD;
}
long long sum(int l, int r){
long long res = t[r] - t[l - 1];
return res;
}
void SOLVE(){
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> h[i];
for (int i = 1; i <= n; i ++){
cin >> w[i];
t[i] = t[i - 1] + w[i];
}
stack < int > st1;
st1.push(0);
for (int i = 1; i <= n; i ++){
while (h[st1.top()] >= h[i])
st1.pop();
l[i] = st1.top() + 1;
st1.push(i);
}
stack < int > st2;
st2.push(n + 1);
for (int i = n; i >= 1; i --){
while (h[st2.top()] >= h[i])
st2.pop();
r[i] = st2.top() - 1;
st2.push(i);
}
for (int i = 1; i <= n; i++){
a.push_back({i, h[i]});
}
sort(a.begin(), a.end(), cmp);
long long ans = 0;
for (DATA i : a){
int id = i.id;
int val = i.val;
long long len = sum(l[id], r[id]);
long long res = 1ll * calc(len) * calc(val) % MOD;
long long len2 = Get(1, 1, n, id, id);
long long res2 = 1ll * calc(len2) * calc(len) % MOD;
// cout << id << " " << l[id] << " " << r[id] << " "
// << val << " " << len << " " << res
// << " " << len2 << " " << res2 << endl;
res -= res2;
if (res < 0)
res += MOD;
ans += res;
ans %= MOD;
upd(1, 1, n, l[id], r[id], val);
}
cout << ans;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
#define TASK "hist"
if (fopen(TASK".inp","r")){
freopen(TASK".inp","r",stdin);
freopen(TASK".out","w",stdout);
}
int nTest = 1;
// cin >> nTest;
while (nTest --){
SOLVE();
}
return 0;
}
Compilation message (stderr)
fancyfence.cpp: In function 'int main()':
fancyfence.cpp:179:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
179 | freopen(TASK".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
fancyfence.cpp:180:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
180 | freopen(TASK".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~| # | 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... |