Link to this code:
https://cses.fi/paste/a08d91d000cd0bd0c6a48a/
#include <algorithm>
#include <iostream>
#include <vector>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("fast-math")
#pragma GCC target("popcnt")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma")
using namespace std;
const int N = 1 << 18;
vector<int> tree[2 * N];
int query(int a, int b, int c, int d) {
a += N;
b += N;
int count = 0;
while (a <= b) {
if (a&1) {
count += upper_bound(tree[a].begin(), tree[a].end(), d) -
lower_bound(tree[a].begin(), tree[a].end(), c);
a++;
}
if (!(b&1)) {
count += upper_bound(tree[b].begin(), tree[b].end(), d) -
lower_bound(tree[b].begin(), tree[b].end(), c);
b--;
}
a >>= 1;
b >>= 1;
}
return count;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
tree[N + i] = {x};
}
for (int i = N - 1; i >= 1; i--) {
merge(tree[i<<1].begin(), tree[i<<1].end(), tree[(i<<1)+1].begin(),
tree[(i<<1)+1].end(), back_inserter(tree[i]));
}
while (q--) {
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << query(a, b, c, d) << "\n";
}
}