#2276
Se consideră un șir a[1]
, a[2]
, …, a[n]
de numere naturale. Se dau și T
intervale închise de forma [x, y]
, cu x ≤ y
.
Cerința
Pentru fiecare din cele T
intervale de forma [x, y]
trebuie să răspundeți la întrebarea: câte numere din șir aparțin intervalului [x, y]
?
Date de intrare
Programul citește de la tastatură numerele n
și T
, apoi n
numere naturale, separate prin spații, a[1]
, a[2]
, …, a[n]
. Pe următoarele T
linii se află câte două numere naturale x
și y
reprezentând un interval [x, y]
.
Date de ieșire
Programul va afișa pe ecran T linii. Pe fiecare linie i
(i=1..T
) se va afla un singur număr natural reprezentând răspunsul la a i
-a întrebare.
Restricții și precizări
1 ≤ n, T ≤ 200 000
0 ≤ a[i] ≤ 2 000 000 000
0 ≤ x ≤ y ≤ 2 000 000 000
Exemplu
Intrare
9 7 6 1 3 5 3 3 9 20 9 4 10 0 100 0 1 500 506 3 3 10 18 3 9
Ieșire
4 9 1 0 3 0 7
#include <bits/stdc++.h> #define nmax 200003 using namespace std; int a[nmax], n; /// cauta binar cea mai din stanga pozitie p /// cu proprietatea ca x <= a[p] int CautBin1(int x) { if (a[n] < x) return n + 1; if (x <= a[1]) return 1; int st, dr, m, p; st = 1; dr = n; p = 1; while (st <= dr) { m = (st + dr) / 2; if (x <= a[m]) { p = m; dr = m - 1; } else st = m + 1; } return p; } /// cauta binar cea mai din dreapta pozitie p /// cu proprietatea ca a[p] <= y int CautBin2(int y) { if (a[n] <= y) return n; if (a[1] > y) return 0; int st, dr, m, p; st = 1; dr = n; p = 1; while (st <= dr) { m = (st + dr) / 2; if (a[m] <= y) { p = m; st = m + 1; } else dr = m - 1; } return p; } int main() { int i, p, q, T, x, y; cin >> n >> T; for (i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + n + 1); while (T--) { cin >> x >> y; p = CautBin1(x); q = CautBin2(y); cout << (q - p + 1) << "\n"; } return 0; }