#include <iostream>
#include <vector>
#include <stack>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
// Funkcja pomocnicza do obliczania n*(n+1)/2 modulo MOD
ll count_pairs(ll n) {
ll res = (n % MOD) * ((n + 1) % MOD) % MOD;
return (res * 500000004) % MOD; // 500000004 to odwrotność modularna 2 (mod 10^9 + 7)
}
struct Section {
ll h, w;
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
vector<ll> h(N), w(N);
for (int i = 0; i < N; i++) cin >> h[i];
for (int i = 0; i < N; i++) cin >> w[i];
stack<Section> s;
ll total_rectangles = 0;
for (int i = 0; i <= N; i++) {
ll cur_h = (i == N) ? 0 : h[i];
ll cur_w = 0;
while (!s.empty() && s.top().h >= cur_h) {
Section top = s.top();
s.pop();
ll left_h = (s.empty() ? 0 : s.top().h);
// Wybieramy wysokość graniczną (wyższą z cur_h i wysokości poprzedniego elementu na stosie)
ll max_prev_h = max(left_h, cur_h);
// Liczymy prostokąty, które mieszczą się w "pasku" od max_prev_h do top.h
ll h_options = (count_pairs(top.h) - count_pairs(max_prev_h) + MOD) % MOD;
ll w_options = count_pairs(top.w + cur_w);
total_rectangles = (total_rectangles + (h_options * w_options) % MOD) % MOD;
// Łączymy szerokość "przerobionego" prostokąta z aktualną szerokością dla następnych kroków
cur_w = (cur_w + top.w) % MOD;
}
if (cur_h > 0) {
s.push({cur_h, (w[i] + cur_w) % MOD});
}
}
cout << total_rectangles << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RhY2s+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBsb25nIGxvbmcgbGw7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OwoKLy8gRnVua2NqYSBwb21vY25pY3phIGRvIG9ibGljemFuaWEgbioobisxKS8yIG1vZHVsbyBNT0QKbGwgY291bnRfcGFpcnMobGwgbikgewogICAgbGwgcmVzID0gKG4gJSBNT0QpICogKChuICsgMSkgJSBNT0QpICUgTU9EOwogICAgcmV0dXJuIChyZXMgKiA1MDAwMDAwMDQpICUgTU9EOyAvLyA1MDAwMDAwMDQgdG8gb2R3cm90bm/Fm8SHIG1vZHVsYXJuYSAyIChtb2QgMTBeOSArIDcpCn0KCnN0cnVjdCBTZWN0aW9uIHsKICAgIGxsIGgsIHc7Cn07CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKCiAgICBpbnQgTjsKICAgIGNpbiA+PiBOOwoKICAgIHZlY3RvcjxsbD4gaChOKSwgdyhOKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBjaW4gPj4gaFtpXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBjaW4gPj4gd1tpXTsKCiAgICBzdGFjazxTZWN0aW9uPiBzOwogICAgbGwgdG90YWxfcmVjdGFuZ2xlcyA9IDA7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gTjsgaSsrKSB7CiAgICAgICAgbGwgY3VyX2ggPSAoaSA9PSBOKSA/IDAgOiBoW2ldOwogICAgICAgIGxsIGN1cl93ID0gMDsKCiAgICAgICAgd2hpbGUgKCFzLmVtcHR5KCkgJiYgcy50b3AoKS5oID49IGN1cl9oKSB7CiAgICAgICAgICAgIFNlY3Rpb24gdG9wID0gcy50b3AoKTsKICAgICAgICAgICAgcy5wb3AoKTsKCiAgICAgICAgICAgIGxsIGxlZnRfaCA9IChzLmVtcHR5KCkgPyAwIDogcy50b3AoKS5oKTsKICAgICAgICAgICAgLy8gV3liaWVyYW15IHd5c29rb8WbxIcgZ3Jhbmljem7EhSAod3nFvHN6xIUgeiBjdXJfaCBpIHd5c29rb8WbY2kgcG9wcnplZG5pZWdvIGVsZW1lbnR1IG5hIHN0b3NpZSkKICAgICAgICAgICAgbGwgbWF4X3ByZXZfaCA9IG1heChsZWZ0X2gsIGN1cl9oKTsKCiAgICAgICAgICAgIC8vIExpY3p5bXkgcHJvc3Rva8SFdHksIGt0w7NyZSBtaWVzemN6xIUgc2nEmSB3ICJwYXNrdSIgb2QgbWF4X3ByZXZfaCBkbyB0b3AuaAogICAgICAgICAgICBsbCBoX29wdGlvbnMgPSAoY291bnRfcGFpcnModG9wLmgpIC0gY291bnRfcGFpcnMobWF4X3ByZXZfaCkgKyBNT0QpICUgTU9EOwogICAgICAgICAgICBsbCB3X29wdGlvbnMgPSBjb3VudF9wYWlycyh0b3AudyArIGN1cl93KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRvdGFsX3JlY3RhbmdsZXMgPSAodG90YWxfcmVjdGFuZ2xlcyArIChoX29wdGlvbnMgKiB3X29wdGlvbnMpICUgTU9EKSAlIE1PRDsKCiAgICAgICAgICAgIC8vIMWBxIVjenlteSBzemVyb2tvxZvEhyAicHJ6ZXJvYmlvbmVnbyIgcHJvc3Rva8SFdGEgeiBha3R1YWxuxIUgc3plcm9rb8WbY2nEhSBkbGEgbmFzdMSZcG55Y2gga3Jva8OzdwogICAgICAgICAgICBjdXJfdyA9IChjdXJfdyArIHRvcC53KSAlIE1PRDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGN1cl9oID4gMCkgewogICAgICAgICAgICBzLnB1c2goe2N1cl9oLCAod1tpXSArIGN1cl93KSAlIE1PRH0pOwogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8IHRvdGFsX3JlY3RhbmdsZXMgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==