#include <bits/stdc++.h>
using namespace std;
struct lr {
  long long left, right;
  lr() : left(-1), right(1e7) {}
  lr(long long _l, long long _r) : left(_l), right(_r) {}
};
int main() {
  long long n;
  scanf("%lld", &n);
  vector<long long> arr(n);
  for (int i = 0; i < n; i++) scanf("%lld", &arr[i]);
  vector<lr> mn(n, lr(0, n - 1));
  vector<lr> mx(n, lr(0, n - 1));
  stack<lr> mxs, mns;
  for (int i = 0; i < n; i++) {
    while (!mxs.empty()) {
      if (mxs.top().left >= arr[i]) {
        break;
      } else {
        lr it = mxs.top();
        mxs.pop();
        mx[it.right].right = i - 1;
      }
    }
    mxs.push(lr(arr[i], i));
    while (!mns.empty()) {
      if (mns.top().left <= arr[i]) {
        break;
      } else {
        lr it = mns.top();
        mns.pop();
        mn[it.right].right = i - 1;
      }
    }
    mns.push(lr(arr[i], i));
  }
  while (!mxs.empty()) mxs.pop();
  while (!mns.empty()) mns.pop();
  for (int i = n - 1; i >= 0; i--) {
    while (!mxs.empty()) {
      if (mxs.top().left > arr[i]) {
        break;
      } else {
        lr it = mxs.top();
        mxs.pop();
        mx[it.right].left = i + 1;
      }
    }
    mxs.push(lr(arr[i], i));
    while (!mns.empty()) {
      if (mns.top().left < arr[i]) {
        break;
      } else {
        lr it = mns.top();
        mns.pop();
        mn[it.right].left = i + 1;
      }
    }
    mns.push(lr(arr[i], i));
  }
  long long res = 0;
  for (int i = 0; i < n; i++) {
    long long x1 = mx[i].right - i + 1, x2 = mn[i].right - i + 1,
              n1 = i - mx[i].left + 1, n2 = i - mn[i].left + 1;
    long long a = x1 * n1;
    long long b = x2 * n2;
    res += a * arr[i];
    res -= b * arr[i];
  }
  cout << res << endl;
  return 0;
}
