#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9, MOD = 1e9 + 7, MAXN = 105;
const long double EPS = 1e-9, PI = acos(-1);
struct Vertex {
  int val, left, right;
  Vertex() { val = 0, left = -1, right = -1; }
  Vertex(int a, int b, int c) { val = a, left = b, right = c; }
};
int create(int left, int right, vector<Vertex> &rmq, int &counter) {
  Vertex new_vert(0, -1, -1);
  if (right - left > 1) {
    int middle = (left + right) / 2;
    int left_son = create(left, middle, rmq, counter);
    int right_son = create(middle, right, rmq, counter);
    new_vert = Vertex(0, left_son, right_son);
  }
  rmq.push_back(new_vert);
  return ++counter - 1;
}
int update(int vert, int left, int right, int pos, vector<Vertex> &rmq,
           int &counter) {
  Vertex new_vert(rmq[vert].val + 1, -1, -1);
  if (right - left > 1) {
    int middle = (left + right) / 2;
    if (pos < middle) {
      int left_son = update(rmq[vert].left, left, middle, pos, rmq, counter);
      new_vert = Vertex(rmq[left_son].val + rmq[rmq[vert].right].val, left_son,
                        rmq[vert].right);
    } else {
      int right_son = update(rmq[vert].right, middle, right, pos, rmq, counter);
      new_vert = Vertex(rmq[rmq[vert].left].val + rmq[right_son].val,
                        rmq[vert].left, right_son);
    }
  }
  rmq.push_back(new_vert);
  return ++counter - 1;
}
int get(int vert, int left, int right, int L, int R,
        const vector<Vertex> &rmq) {
  if (left == L && right == R) return rmq[vert].val;
  if (L >= R || vert == -1) return 0;
  int middle = (left + right) / 2;
  return get(rmq[vert].left, left, middle, L, min(middle, R), rmq) +
         get(rmq[vert].right, middle, right, max(L, middle), R, rmq);
}
long long rect_get(int xleft, int yleft, int xright, int yright, int n,
                   const vector<Vertex> &rmq, const vector<int> &parents) {
  if (xleft > xright || yleft > yright) return 0;
  return (long long)get(parents[xright], 0, n, yleft, yright + 1, rmq) -
         (long long)(xleft
                         ? get(parents[xleft - 1], 0, n, yleft, yright + 1, rmq)
                         : 0);
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, q;
  cin >> n >> q;
  vector<int> nums(n);
  for (int i = 0; i < n; ++i) cin >> nums[i];
  vector<Vertex> rmq;
  vector<int> parents(n);
  int counter = 0;
  create(0, n, rmq, counter);
  for (int i = 0; i < n; ++i) {
    update(counter - 1, 0, n, nums[i] - 1, rmq, counter);
    parents[i] = counter - 1;
  }
  for (int i = 0; i < q; ++i) {
    int xleft, yleft, xright, yright;
    cin >> xleft >> yleft >> xright >> yright;
    xleft--;
    yleft--;
    xright--;
    yright--;
    long long answer = 0;
    long long ans1 = rect_get(0, 0, xleft - 1, yleft - 1, n, rmq, parents);
    long long ans5 = rect_get(xleft, yleft, xright, yright, n, rmq, parents);
    long long ans9 =
        rect_get(xright + 1, yright + 1, n - 1, n - 1, n, rmq, parents);
    long long ans3 = rect_get(0, yright + 1, xleft - 1, n - 1, n, rmq, parents);
    long long ans7 = rect_get(xright + 1, 0, n - 1, yleft - 1, n, rmq, parents);
    long long ans2 = xleft - ans1 - ans3;
    long long ans4 = yleft - ans1 - ans7;
    long long ans6 = (xright - xleft + 1) - ans5 - ans4;
    long long ans8 = (yright - yleft + 1) - ans2 - ans5;
    answer += ans1 * (ans5 + ans6 + ans9 + ans8);
    answer += ans2 * (n - xleft);
    answer += ans3 * (ans5 + ans7 + ans4 + ans8);
    answer += ans4 * (ans6 + ans5);
    answer += ans6 * ans5;
    answer += (ans5 * (ans5 - 1)) / 2;
    answer += ans9 * (ans5 + ans4);
    answer += ans8 * (ans5 + ans6 + ans4);
    answer += ans7 * (ans5 + ans6);
    cout << answer << "\n";
  }
  return 0;
}
