#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r;
  int sum;
} t[4000141];
int root[200141], n, Q, m, i, j, k, l;
long long ans, a[10];
int init(int n, int s, int e, int x) {
  int i = (s + e) >> 1, j = ++m;
  if (s == e) {
    t[j].sum = 1;
    return j;
  }
  if (i < x) {
    t[j].l = t[n].l;
    t[j].r = init(t[n].r, i + 1, e, x);
  } else {
    t[j].r = t[n].r;
    t[j].l = init(t[n].l, s, i, x);
  }
  t[j].sum = t[t[j].l].sum + t[t[j].r].sum;
  return j;
}
int q(int n, int s, int e, int l, int r) {
  if (n) {
    if (r < s || e < l) return 0;
    if (l <= s && e <= r) return t[n].sum;
    int m = (s + e) >> 1;
    return q(t[n].l, s, m, l, r) + q(t[n].r, m + 1, e, l, r);
  }
  return 0;
}
long long query(int x1, int x2, int y1, int y2) {
  if (x2 < x1 || y2 < y1) return 0;
  return q(root[y2], 1, n, x1, x2) - q(root[y1 - 1], 1, n, x1, x2);
}
int main() {
  t[0].l = t[0].r = t[0].sum = 0;
  for (scanf("%d%d", &n, &Q); i < n; i++) {
    scanf("%d", &j);
    root[i + 1] = init(root[i], 1, n, j);
  }
  for (; Q > 0; Q--) {
    scanf("%d%d%d%d", &k, &i, &l, &j);
    a[1] = query(j + 1, n, 1, k - 1);
    a[2] = query(j + 1, n, k, l);
    a[3] = query(j + 1, n, l + 1, n);
    a[4] = query(i, j, 1, k - 1);
    a[5] = query(i, j, k, l);
    a[6] = query(i, j, l + 1, n);
    a[7] = query(1, i - 1, 1, k - 1);
    a[8] = query(1, i - 1, k, l);
    a[9] = query(1, i - 1, l + 1, n);
    ans = a[5] * (a[5] - 1) / 2;
    ans += a[5] * (n - a[5]);
    ans += a[1] * a[6];
    ans += a[1] * a[8];
    ans += a[1] * a[9];
    ans += a[2] * a[4];
    ans += a[2] * a[6];
    ans += a[2] * a[7];
    ans += a[2] * a[8];
    ans += a[2] * a[9];
    ans += a[3] * a[4];
    ans += a[3] * a[7];
    ans += a[3] * a[8];
    ans += a[4] * a[6];
    ans += a[4] * a[8];
    ans += a[4] * a[9];
    ans += a[6] * a[7];
    ans += a[6] * a[8];
    printf("%I64d\n", ans);
  }
  return 0;
}
