Для любителів статистики#4421

Для любителів статистики (Розбір)

Нехай масив містить статистичні дані про кількість людей, перевезених трамваями. Для кожної кількості перевезених людей ми зберігаємо вектор індексів, на яких це значення зустрічається. Іншими словами, в map відображенні зберігаються номери міст, в яких за рік було перевезено рівно осіб.

Запит вигляду (l, r, x) обробляється наступним чином:

Приклад

Розглянемо, як виглядатиме структура для першого прикладу.

Наприклад, для обробки запиту (1, 5, 314) необхідно виконати наступні кроки:

Реалізація алгоритму

Оголосимо використовувані структури даних:

vector<int> v;
map<int, vector<int>> p;

Читаємо вхідні дані.

cin >> n;
v.resize(n + 1);
for (i = 1; i <= n; i++)
{
  cin >> v[i];

У місті номер перевезено людей. Міста нумеруємо починаючи з .

  p[v[i]].push_back(i);
}

Читаємо кількість запитів .

cin >> q;

Відповідь будемо генерувати в рядку .

result = "";

Послідовно обробляємо запитів (l, r, x).

for (i = 0; i < q; i++)
{
  cin >> l >> r >> x;

Якщо пасажирів не перевозилося в жодному місті, то в відповідь записуємо '0'.

  if (p.find(x) == p.end())
  {
    result += '0';
    continue;
  }

Необхідно визначити, чи є в масиві хоча б одне число від до . Шукаємо перше входження в , не менше .

  vector<int>::iterator it = lower_bound(p[x].begin(), p[x].end(), l);

Якщо таке число присутнє і воно не більше , то в відповідь записуємо '1'.

  if (it != p[x].end() && *it <= r)
    result += '1';
  else
    result += '0';
}

Виводимо відповідь.

cout << result << endl;