#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > marks(200002);
vector<pair<int, int> > marksbyy(200002);
vector<vector<int> > partials(2005, vector<int>(2005));
vector<vector<int> > inpart(2005, vector<int>(2005));
int n;
void fillpart() {
  sort(marks.begin() + 1, marks.begin() + n + 1);
  sort(marksbyy.begin() + 1, marksbyy.begin() + n + 1);
  for (int i = 1; i <= n; i++) {
    int j = marks[i].second;
    inpart[(i - 1) / 100][(j - 1) / 100]++;
  }
  partials[0][0] = inpart[0][0];
  for (int i = 1; i <= 2000; i++) {
    partials[0][i] = partials[0][i - 1] + inpart[0][i];
  }
  for (int i = 1; i <= 2000; i++) {
    partials[i][0] = partials[i - 1][0] + inpart[i][0];
  }
  for (int i = 1; i <= 2000; i++) {
    for (int j = 1; j <= 2000; j++) {
      partials[i][j] = partials[i - 1][j] + partials[i][j - 1] -
                       partials[i - 1][j - 1] + inpart[i][j];
    }
  }
}
int query(int x, int y) {
  int ans = 0;
  int biggestpartx = x / 100 - 1;
  int biggestparty = y / 100 - 1;
  if (biggestpartx >= 0 && biggestparty >= 0) {
    ans += partials[biggestpartx][biggestparty];
    for (int i = (biggestpartx + 1) * 100 + 1; i <= x; i++) {
      if (marks[i].second <= (biggestparty + 1) * 100) {
        ans++;
      }
    }
    for (int i = (biggestparty + 1) * 100 + 1; i <= y; i++) {
      if (marksbyy[i].second <= x) {
        ans++;
      }
    }
  } else {
    for (int i = 1; i <= x; i++) {
      if (marks[i].second <= y) {
        ans++;
      }
    }
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int q;
  cin >> n >> q;
  vector<int> arr(n);
  for (int i = 1; i <= n; i++) {
    int x;
    cin >> x;
    x = n + 1 - x;
    marks[i] = make_pair(x, i);
    marksbyy[i] = make_pair(i, x);
  }
  fillpart();
  for (int i = 0; i < q; i++) {
    int l, d, r, u;
    cin >> l >> d >> r >> u;
    u = n + 1 - u;
    d = n + 1 - d;
    long long int topleft = query(u - 1, l - 1);
    long long int top = query(u - 1, r) - topleft;
    long long int left = query(d, l - 1) - topleft;
    long long int inside = query(d, r) - topleft - top - left;
    long long int topright = query(u - 1, n) - top - topleft;
    long long int bottomleft = query(n, l - 1) - left - topleft;
    long long int bottom =
        query(n, r) - inside - bottomleft - topleft - top - left;
    long long int right =
        query(d, n) - inside - topright - topleft - top - left;
    long long int bottomright = query(n, n) - inside - topright - topleft -
                                top - left - bottom - bottomleft - right;
    long long int ans = 0;
    ans += topleft * (bottom + right + bottomright + inside);
    ans += topright * (bottom + left + bottomleft + inside);
    ans += bottomleft * (top + right + topright + inside);
    ans += bottomright * (top + left + topleft + inside);
    ans += inside * (topright + topleft + bottomleft + bottomright + top +
                     right + bottom + left + inside - 1);
    ans += top * (bottom + left + right + bottomleft + bottomright + inside);
    ans += right * (top + left + bottom + topleft + bottomleft + inside);
    ans += bottom * (top + left + right + topleft + topright + inside);
    ans += left * (top + bottom + right + topright + bottomright + inside);
    ans /= 2;
    cout << ans << "\n";
  }
  return 0;
}
