Link to this code:
https://cses.fi/paste/7bafb6e6b0eb0ca1e3fd07/#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
const ll int maxN = 200005;
vector<ll int> arr(maxN,0);
vector<ll int> t[4*maxN];
void build(ll int si,ll int ss, ll int se){
if(ss==se) t[si].push_back(arr[ss]);
else{
ll int mid = (ss+se)/2;
build(si*2,ss,mid);
build(si*2+1,mid+1,se);
ll int l=0,r=0;
t[si].reserve(t[si*2].size() + t[si*2+1].size());
while(l<t[si*2].size() && r<t[si*2+1].size()){
if(t[si*2][l]<=t[si*2+1][r]){
t[si].push_back(t[si*2][l]);
l++;
}else{
t[si].push_back(t[si*2+1][r]);
r++;
}
}
while(l<t[si*2].size()){
t[si].push_back(t[si*2][l]);
l++;
}
while(r<t[si*2+1].size()){
t[si].push_back(t[si*2+1][r]);
r++;
}
return;
}
}
ll int query(ll int si,ll int ss, ll int se,ll int qs, ll int qe, ll int c,ll int d){
if(qs>se || qe<ss) return 0;
if(ss>=qs && se<=qe){
ll it = upper_bound(t[si].begin(),t[si].end(),d)-lower_bound(t[si].begin(),t[si].end(),c);
return it;
}else{
ll int mid = (ss+se)/2;
return query(si*2,ss,mid,qs,qe,c,d)+query(si*2+1,mid+1,se,qs,qe,c,d);
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll int n,q;
cin>>n>>q;
for(ll int i=1;i<=n;i++) cin>>arr[i];
build(1,1,n);
for(ll int i=1;i<=q;i++){
ll int u,v,c,d;
cin>>u>>v>>c>>d;
cout<<query(1,1,n,u,v,c,d)<<endl;
}
return 0;
}