#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int q, p, root[maxn], cnt;
long long n;
struct node {
  int l, r;
  long long v;
} seg[maxn * 20];
void update(int &x, int y, int l, int r, int p) {
  x = ++cnt;
  seg[x] = seg[y];
  ++seg[x].v;
  if (l == r) return;
  int m = (l + r) >> 1;
  if (m >= p)
    update(seg[x].l, seg[y].l, l, m, p);
  else
    update(seg[x].r, seg[y].r, m + 1, r, p);
}
long long query(int x, int y, int l, int r, int L, int R) {
  if (L <= l && R >= r) return seg[x].v - seg[y].v;
  int m = (l + r) >> 1;
  long long ret = 0;
  if (m >= L) ret += query(seg[x].l, seg[y].l, l, m, L, R);
  if (m < R) ret += query(seg[x].r, seg[y].r, m + 1, r, L, R);
  return ret;
}
inline long long go(int l, int r, int u, int d) {
  if (l > r || u > d) return 0;
  long long ret = query(root[r], root[l - 1], 1, n, u, d);
  return ret * (ret - 1) / 2;
}
int main() {
  scanf("%I64d%d", &n, &q);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &p);
    update(root[i], root[i - 1], 1, n, p);
  }
  while (q--) {
    int l, d, r, u;
    scanf("%d%d%d%d", &l, &d, &r, &u);
    printf("%I64d\n", n * (n - 1) / 2 - go(1, l - 1, 1, n) -
                          go(r + 1, n, 1, n) - go(1, n, 1, d - 1) -
                          go(1, n, u + 1, n) + go(1, l - 1, 1, d - 1) +
                          go(1, l - 1, u + 1, n) + go(r + 1, n, 1, d - 1) +
                          go(r + 1, n, u + 1, n));
  }
  return 0;
}
