#include using namespace std; typedef long long ll; const int MOD = 1000000007; const int MAXN = 2<<17; int arr[MAXN]; struct node { //vector vec; vector prefmaxs; vector sprefmaxs; } tour[2 * MAXN]; void merge(const node& a, const node& b, node& c) { //c.vec = vector(a.vec.size() + b.vec.size()); //merge(a.vec.begin(), a.vec.end(), b.vec.begin(), b.vec.end(), c.vec.begin()); c.prefmaxs = a.prefmaxs; c.sprefmaxs = a.sprefmaxs; for (int x: b.prefmaxs) { int y = max(x, c.prefmaxs.back()); c.prefmaxs.push_back(y); c.sprefmaxs.push_back(c.sprefmaxs.back() + y); } } vector nodes; void query(int start, int stop, int node = 1, int lo = 0, int hi = MAXN) { if (lo >= start && hi <= stop) { nodes.push_back(node); return; } if (lo >= stop || hi <= start) return; int mid = (lo + hi) / 2; query(start, stop, 2 * node, lo, mid); query(start, stop, 2 * node + 1, mid, hi); } pair calc(ll mx) { ll ret = 0; for (int node: nodes) { int pos = lower_bound(tour[node].prefmaxs.begin(), tour[node].prefmaxs.end(), mx) - tour[node].prefmaxs.begin(); ret += mx * pos; ret += tour[node].sprefmaxs.back(); if (pos) ret -= tour[node].sprefmaxs[pos - 1]; mx = max(mx, (ll)tour[node].prefmaxs.back()); } return make_pair(ret % MOD, mx); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; ll sol = 0; cin>>n; for (int i = 0; i < n; ++i) { cin>>arr[i]; tour[MAXN + i].prefmaxs.push_back(arr[i]); tour[MAXN + i].sprefmaxs.push_back(arr[i]); } for (int i = MAXN - 1; i > 0; --i) merge(tour[2 * i], tour[2 * i + 1], tour[i]); /*for (int i = 1; i < 2 * MAXN; ++i) { cout<> gcds; gcds.push_back({n, 0}); for (int i = n - 1; i >= 0; i--) { gcds.emplace_front(i, arr[i]); for (auto it = gcds.begin(); next(it) != gcds.end();) { it->second = __gcd(it->second, arr[i]); if (it == gcds.begin() || prev(it)->second != it->second) { ++it; } else { it = gcds.erase(it); } } /*for (auto x: gcds) cout<first; int j = jt->first; int x = it->second; nodes.clear(); query(i, j); /*cout<