2
pub fn total_strength(strength: Vec<i32>) -> i32 {3
const MOD: i64 = 1_000_000_007;4
let strength = strength.into_iter().map(|x| x as i64).collect::<Vec<_>>();5
let N = strength.len();6
let N_i64 = strength.len() as i64;8
let mut ps_l = vec![0; strength.len() + 1];9
let mut pm_l = vec![0; strength.len() + 1];12
ps_l[i + 1] = (ps_l[i] + strength[i]) % MOD;14
pm_l[i + 1] = (pm_l[i] + (i_64 + 1) * strength[i]) % MOD;17
let mut ps_r = vec![0; strength.len() + 1];18
let mut pm_r = vec![0; strength.len() + 1];20
for i in (0..N).rev() {21
ps_r[i] = (ps_r[i + 1] + strength[i]) % MOD;23
pm_r[i] = (pm_r[i + 1] + (N_i64 - i_64) * strength[i]) % MOD;26
let mut stack = vec![];30
while !stack.is_empty() && (right == N || strength[*stack.last().unwrap()] >= strength[right])32
let pivot = stack.pop().unwrap();33
let pivot_i64 = pivot as i64;35
let left_i64 = stack.last().map(|x| *x as i64 + 1).unwrap_or(0);36
let left = left_i64 as usize;38
let right_i64 = right as i64;41
(MOD + pm_l[pivot + 1] - pm_l[left] - left_i64 * (ps_l[pivot + 1] - ps_l[left]) % MOD)44
let right_sum = (MOD + pm_r[pivot + 1]46
- (N_i64 - right_i64) * (ps_r[pivot + 1] - ps_r[right]))50
(left_sum * (right_i64 - pivot_i64) + right_sum * (pivot_i64 - left_i64 + 1)) % MOD;52
ans = (ans + all_sum * strength[pivot]) % MOD;