2
public int totalStrength(int[] strength) {5
int len = strength.length;7
long[] prefix = prefixSum(strength, len, mod);9
Deque<Integer> stack = new ArrayDeque<>();13
for (int i = 0; i < len; i++) {14
while (stack.peek() != -1 && strength[i] <= strength[stack.peek()]) {15
int mid = stack.pop();16
int left = stack.peek() + 1;20
int t = (right - mid);22
long val = (1l * (1 + n) * (prefix[right + 2] - prefix[mid + 1]) + mod) % mod;23
val -= (1l * (1 + t) * (prefix[mid + 1] - prefix[left]) + mod) % mod;34
while (stack.peek() != -1) {35
int mid = stack.pop();36
int left = stack.peek() + 1;39
int t = (right - mid);41
long val = (1l * (1 + n) * (prefix[right + 2] - prefix[mid + 1]) + mod) % mod;42
val -= (1l * (1 + t) * (prefix[mid + 1] - prefix[left]) + mod) % mod;49
return (int) ((ans + mod) % mod);52
private long[] prefixSum(int[] strength, int len, int mod) {53
long[] prefix = new long[len + 1];55
for (int i = 0; i < len; i++) {56
prefix[i + 1] = prefix[i] + strength[i];59
long[] doublePrefix = new long[len + 2];60
for (int i = 0; i <= len; i++) {61
doublePrefix[i + 1] = (doublePrefix[i] + prefix[i]) % mod;