#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 2e5 + 5;
const int LOG = 18;
int n, q;
int a[N];
ll pref[N];
int f[LOG][N]; // f[k][i] = Max của đoạn bắt đầu từ i và có độ dài là 2^k
int log2_floor(int x) {
return 31 - __builtin_clz(x);
}
void precompute() {
for (int i = 1; i <= n; i++) pref[i] = pref[i - 1] + a[i];
for (int i = 1; i <= n; i++) f[0][i] = a[i];
for (int k = 1; k < LOG; k++) {
for (int i = 1; i + (1 << k) - 1 <= n; i++) {
f[k][i] = max(f[k - 1][i], f[k - 1][i + (1 << (k - 1))]);
}
}
}
ll getSum(int l, int r) {
return pref[r] - pref[l - 1];
}
int getMax(int l, int r) {
int k = log2_floor(r - l + 1);
return max(f[k][l], f[k][r - (1 << k) + 1]);
}
// Vị trí j nhỏ nhất > i sao cho a[j] > a[i]
int nextGreater(int i) {
int l = i + 1, r = n, ans = n + 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (getMax(i, mid) > a[i]) {
ans = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
return ans;
}
int nxt[LOG][N];
ll cost[LOG][N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
precompute();
// Đặt nxt[0][i] = nextGreater(i)
// Khi đó a[i] chính là max của đoạn [i, nxt[0][i] - 1]
// cost[0][i] = Số thao tác ít nhất cần sử dụng khi xét đoạn [i, nxt[0][i] - 1]
for (int i = 1; i <= n; i++) {
nxt[0][i] = nextGreater(i);
cost[0][i] = 1ll * (nxt[0][i] - i) * a[i] - getSum(i, nxt[0][i] - 1);
}
nxt[0][n + 1] = n + 1;
cost[0][n + 1] = 0;
for (int k = 1; k < LOG; k++) {
for (int i = 1; i <= n + 1; i++) {
nxt[k][i] = nxt[k - 1][nxt[k - 1][i]];
cost[k][i] = cost[k - 1][i] + cost[k - 1][nxt[k - 1][i]];
}
}
while (q--) {
int l, r;
cin >> l >> r;
ll ans = 0;
for (int k = LOG - 1; k >= 0; k--) {
if (nxt[k][l] <= r) {
ans += cost[k][l];
l = nxt[k][l];
}
}
ans += 1ll * (r - l + 1) * a[l] - getSum(l, r); // đoạn còn dư ra
cout << ans << '\n';
}
}