cb

#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;
}
%d bloggers like this: