#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3fffffff;
const int SINF = 0x7fffffff;
const long long LINF = 0x3fffffffffffffff;
const long long SLINF = 0x7fffffffffffffff;
const int MAXN = 200007;
const int MAXS = 2000007;
int OK[3 * 3 * 3 * 3];
class ftT {
 public:
  void upd(int p, int x) {
    for (; p < MAXN; p += p & -p) data[p] += x;
  }
  int sum(int p) {
    int ans = 0;
    for (; p; p ^= p & -p) ans += data[p];
    return ans;
  }

 private:
  int data[MAXN];
} ft;
struct qT {
  int l, d, r, u;
} que[MAXN];
struct oT {
  void setd(int _id, int _x, int _y) { id = _id, x = _x, y = _y; }
  int id, x, y, ans;
} nq[MAXS];
int n, q;
int nk;
int cp[MAXN], p[MAXN];
int nt[3][3];
void init();
void input();
void work();
void presolve();
int main() {
  init();
  input();
  work();
}
void init() {
  ios::sync_with_stdio(false);
  for (int a = 0; a < 3; ++a) {
    for (int b = 0; b < 3; ++b) {
      for (int c = 0; c < 3; ++c) {
        for (int d = 0; d < 3; ++d) {
          if (a * 3 + b < c * 3 + d) {
            if (((((a) < (c)) ? (a) : (c)) <= 1 &&
                 (((a) > (c)) ? (a) : (c)) >= 1) &&
                ((((b) < (d)) ? (b) : (d)) <= 1 &&
                 (((b) > (d)) ? (b) : (d)) >= 1)) {
              OK[a * 27 + b * 9 + c * 3 + d] = 1;
            }
          }
        }
      }
    }
  }
}
void input() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; ++i) scanf("%d", &cp[i]);
  for (int i = 1; i <= q; ++i)
    scanf("%d%d%d%d", &que[i].l, &que[i].d, &que[i].r, &que[i].u);
}
void work() {
  for (int i = 1; i <= n; ++i) p[cp[i]] = i;
  nk = 0;
  int nx, ny;
  for (int i = 1; i <= q; ++i) {
    for (int j = 0; j < 3; ++j) {
      nx = (j == 0) ? (que[i].d - 1) : (j == 1) ? (que[i].u) : n;
      for (int k = 0; k < 3; ++k) {
        ny = (k == 0) ? (que[i].l - 1) : (k == 1) ? (que[i].r) : n;
        nq[++nk].setd(nk, nx, ny);
      }
    }
  }
  presolve();
  nk = 0;
  long long ans = 0;
  int na, nb, nc, nd;
  for (int i = 1; i <= q; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 3; ++k) {
        nt[j][k] = nq[++nk].ans;
      }
    }
    for (int a = 0; a < 3; ++a) {
      na = a * 27;
      for (int b = 0; b < 3; ++b) {
        nb = na + b * 9;
        for (int c = 0; c < 3; ++c) {
          nc = nb + c * 3;
          for (int d = 0; d < 3; ++d) {
            nd = nc + d;
            if (c <= a && d <= b && ((a ^ c) || (b ^ d))) {
              nt[a][b] -= nt[c][d];
            }
          }
        }
      }
    }
    ans = 0;
    for (int a = 0; a < 3; ++a) {
      na = a * 27;
      for (int b = 0; b < 3; ++b) {
        nb = na + b * 9;
        for (int c = 0; c < 3; ++c) {
          nc = nb + c * 3;
          for (int d = 0; d < 3; ++d) {
            nd = nc + d;
            if (OK[nd]) {
              ans += static_cast<long long>(nt[a][b]) * nt[c][d];
            }
          }
        }
      }
    }
    ans += static_cast<long long>(nt[1][1]) * (nt[1][1] - 1) >> 1;
    printf("%I64d\n", ans);
  }
}
void presolve() {
  sort(nq + 1, nq + 1 + nk, [](const oT &a, const oT &b) {
    return (a.x ^ b.x) ? (a.x < b.x) : (a.y < b.y);
  });
  int iq = 1;
  for (; iq <= nk && nq[iq].x == 0; ++iq)
    ;
  for (int i = 1; i <= n; ++i) {
    ft.upd(p[i], 1);
    for (; iq <= nk && nq[iq].x == i; ++iq) {
      nq[iq].ans = ft.sum(nq[iq].y);
    }
  }
  sort(nq + 1, nq + 1 + nk,
       [](const oT &a, const oT &b) { return a.id < b.id; });
}
