#include <bits/stdc++.h>
using namespace std;
template <typename T>
bool chmax(T& a, const T& b) {
  return a < b ? (a = b, true) : false;
}
template <typename T>
bool chmin(T& a, const T& b) {
  return b < a ? (a = b, true) : false;
}
int N, Q;
int main() {
  scanf("%d%d", &N, &Q);
  vector<long long> A(N);
  for (int i = (0); i < (N); i++) {
    scanf("%lld", &A[i]);
  }
  vector<pair<long long, int> > P(N - 1);
  for (int i = (0); i < (N - 1); i++) {
    P[i] = {abs(A[i] - A[i + 1]), i};
  }
  sort((P).begin(), (P).end(), greater<pair<long long, int> >());
  vector<pair<int, int> > query(Q);
  for (int i = (0); i < (Q); i++) {
    scanf("%d%d", &query[i].first, &query[i].second);
    query[i].first--;
    query[i].second--;
  }
  vector<long long> ans(Q);
  set<int> st;
  st.insert(-1);
  st.insert(N - 1);
  for (int i = (0); i < (N - 1); i++) {
    int idx = P[i].second;
    auto it = st.lower_bound(idx);
    int r = *it;
    it--;
    int l = *it + 1;
    st.insert(idx);
    for (int j = (0); j < (Q); j++)
      if (idx >= query[j].first && idx < query[j].second) {
        int nl = max(l, query[j].first), nr = min(r, query[j].second);
        long long tmp1 = max(0, idx - nl + 1);
        long long tmp2 = max(0, nr - idx);
        ans[j] += tmp1 * tmp2 * P[i].first;
      }
  }
  for (int i = (0); i < (Q); i++) {
    printf("%lld\n", ans[i]);
  }
  return 0;
}
