1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <algorithm> #include<bits/stdc++.h> using namespace std;
#define DEBUG #ifdef DEBUG #define de(x) cout << (#x) << "=" << (x) << endl; #define de2(x, y) cout << (#x) << " " << (#y) << " = " << (x) << " " << (y) << endl; #else #define de(x) 42 #define de2(x, y) 42 #endif #define endl '\n' #define fi(n) for(int i = 1;i <= n; ++i) #define fi0(n) for(int i = 0;i < n; ++i) #define fj(n) for(int j = 1;j <= n; ++j) #define all(x) (x).begin(), (x).end() #define hello ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); #define world return 0;
typedef vector<int> vi; typedef pair<int, int> pii; typedef long long ll;
const int N = 2e5 + 10; int a[N], b[N];
struct Node{ int l, r, cnt; }; Node tr[N<<5]; int idx = 0; int root[N];
int update(int pre, int v, int l, int r) { int cur = ++idx; tr[cur] = tr[pre]; tr[cur].cnt++; if(l == r) return cur; int mid = (l + r) >> 1; if(v <= mid) tr[cur].l = update(tr[pre].l, v, l, mid); else tr[cur].r = update(tr[pre].r, v, mid+1, r); return cur; }
int query(int u, int v, int l, int r, int ql, int qr) { if(r < l) return 0; if(l <= ql && r >= qr) { return tr[v].cnt - tr[u].cnt; }
int mid = (ql + qr) >> 1;
int res = 0; if(l <= mid) res += query(tr[u].l, tr[v].l, l, r, ql, mid); if(r > mid) res += query(tr[u].r, tr[v].r, l, r, mid+1, qr); return res; }
signed main() { hello;
int n, m; cin >> n >> m; fi(n) { cin >> a[i]; b[i] = a[i]; }
sort(a+1, a+1+n); int sz = unique(a+1, a+1+n) - (a+1);
for(int i = 1;i <= n; ++i ) { int ri = lower_bound(a+1, a+1+sz, b[i]) - a; root[i] = update(root[i-1], ri, 1, sz); }
fi(m) { int u, v, l, r; cin >> u >> v >> l >> r; int rl = lower_bound(a+1, a+1+sz, l) - a ; int rr = upper_bound(a+1, a+1+sz, r) - (a+1); cout << query(root[u-1], root[v], rl, rr, 1, sz) << endl; }
}
|