Link to this code: https://cses.fi/paste/c654cb8b9fba06e1cf5885/
// Author : -CHUNU-
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define MOD 1000000007 
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
 
typedef tree<long long,null_type,less
<long long>,rb_tree_tag, tree_order_statistics_node_update> o_set;
typedef tree<long long,null_type,less_equal<long long>,rb_tree_tag, tree_order_statistics_node_update> o_multiset;
#define int long long

vector<vector<int>>sgt;
vector<vector<int>>sgtl;
vector<vector<int>>sgtr;
vector<int>v;
void build(int l, int r, int node){
    if(l == r){
        sgt[node].push_back(v[l]);
        return;
    }
    int mid = (l + r)/2;
    build(l, mid, 2 * node);
    build(mid + 1, r, 2 * node + 1);
    int i = 0, j = 0;
    int n = sgt[2 * node].size(), m = sgt[2 * node + 1].size();
    while(i < n && j < m){
        if(sgt[2 * node][i] < sgt[2 * node + 1][j]){
            sgt[node].push_back(sgt[2 * node][i]);
            sgtl[node].push_back(i);
            sgtr[node].push_back(j-1);
            i++;
        }else{
            sgt[node].push_back(sgt[2 * node + 1][j]);
            sgtl[node].push_back(i-1);
            sgtr[node].push_back(j);
            j++;
        }
    }

    while(i < n){
        sgt[node].push_back(sgt[2 * node][i]);
        sgtl[node].push_back(i);
        sgtr[node].push_back(j-1);
        i++;
    }

    while(j < m){
        sgt[node].push_back(sgt[2 * node + 1][j]);
        sgtl[node].push_back(i-1);
        sgtr[node].push_back(j);
        j++;
    }

    
}

int equery(int l, int r, int node, int idx, int tl, int tr){


   if(l > tr || r < tl)return 0;
   if(l >= tl && r <= tr){
    return idx + 1;
    
   }

    int mid = (l + r)/2;
    int sum = 0;

    if(tl <= mid && idx != -1){
        sum += equery(l, mid, 2 * node, sgtl[node][idx], tl, tr);
    }

    if(tr > mid && idx != -1){
        sum += equery(mid + 1, r, 2 * node + 1, sgtr[node][idx], tl, tr);
    }
    return sum;
}

// 1 1 2 3 3 4 5 5 

void solve(){
   int n, q;
   cin >> n >> q;
   v.resize(n + 1);
   for(int i = 1;i <= n;i++)cin >> v[i];
   sgt.resize(4 * n + 1);
   sgtl.resize(4 * n + 1);
   sgtr.resize(4 * n + 1);
   build(1, n, 1);
   sort(v.begin() + 1, v.end());
   v[0] = 0;


   while(q--){
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    int l = 0, r = n;
    int idx1 = 0;
    while(l <= r){
        int mid = (l + r)/2;
        if(v[mid] <= d){
            idx1 = mid;
            l = mid + 1;
        }else r = mid - 1;
    }
    int val1 = equery(1, n, 1, idx1-1, a, b);
    // cout << val1 <<" ";
   
    l = 0, r = n;
    idx1 = n;
    c--;
    while(l <= r){
        int mid = (l + r)/2;
        if(v[mid] <= c){
            idx1 = mid;
            l = mid + 1;
        }else r = mid - 1;
    }
    // cout << idx1 << endl;

    int val2 = equery(1, n, 1, idx1-1, a, b);
    // cout << val2 <<" ";

    cout << max(0ll, val1 - val2) << endl;
   }


}

int32_t main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);
    int tc = 1;
    // cin >> tc;

    for(int i = 1;i <= tc;i++) {
        solve();
    }

    return 0;
}