#include <bits/stdc++.h>
const int ms = 200200;
int c = 0;
class node;
node* get();
class node {
 public:
  node(int val = 0) {
    sum = val;
    left = this;
    right = this;
  }
  node(node* a, node* b) {
    left = a;
    right = b;
    sum = a->sum + b->sum;
  }
  node* upd(int pos, int val) { return upd(0, ms, pos, val); }
  int qry(int l, int r) { return qry(0, ms, l, r); }

 private:
  node *left, *right;
  int sum;
  int qry(int l, int r, int i, int j) {
    int mid = (l + r) / 2;
    if (i <= l && r <= j)
      return sum;
    else if (r < i || j < l)
      return 0;
    else
      return left->qry(l, mid, i, j) + right->qry(mid + 1, r, i, j);
  }
  node* upd(int l, int r, int pos, int val) {
    int mid = (l + r) / 2;
    node& ans = *(get());
    if (l == r)
      ans = node(sum + val);
    else if (pos <= mid)
      ans = node(left->upd(l, mid, pos, val), right);
    else
      ans = node(left, right->upd(mid + 1, r, pos, val));
    return &ans;
  }
};
node buffer[20 * ms];
node* get() { return &buffer[c++]; }
node* roots[ms];
int qry(int x1, int x2, int y1, int y2) {
  int ans = 0;
  ans += roots[x2]->qry(y1, y2);
  ans -= roots[x1 - 1]->qry(y1, y2);
  return ans;
}
long long pairs(long long x) { return x * (x - 1) / 2; }
int main() {
  roots[0] = get();
  int n, q;
  std::cin >> n >> q;
  for (int i = 1; i <= n; i++) {
    int num;
    scanf("%i", &num);
    roots[i] = roots[i - 1]->upd(num, 1);
  }
  for (int i = n + 1; i < ms; i++) roots[i] = roots[i - 1];
  for (int i = 0; i < q; i++) {
    int x1, x2, y1, y2;
    scanf("%i %i %i %i", &x1, &y1, &x2, &y2);
    long long ans = pairs(n);
    ans -= pairs(qry(1, x1 - 1, 1, n));
    ans -= pairs(qry(x2 + 1, n, 1, n));
    ans -= pairs(qry(1, n, 1, y1 - 1));
    ans -= pairs(qry(1, n, y2 + 1, n));
    ans += pairs(qry(1, x1 - 1, 1, y1 - 1));
    ans += pairs(qry(1, x1 - 1, y2 + 1, n));
    ans += pairs(qry(x2 + 1, n, 1, y1 - 1));
    ans += pairs(qry(x2 + 1, n, y2 + 1, n));
    printf("%lli\n", ans);
  }
}
