Нехай масив містить статистичні дані про кількість людей, перевезених трамваями. Для кожної кількості перевезених людей ми зберігаємо вектор індексів, на яких це значення зустрічається. Іншими словами, в map відображенні зберігаються номери міст, в яких за рік було перевезено рівно осіб.
Запит вигляду (l, r, x) обробляється наступним чином:
Якщо значення відсутнє у структурі map, відразу виводимо '0'.
В іншому випадку за допомогою бінарного пошуку lower_bound знаходимо в масиві перший індекс, не менший .
Якщо знайдений індекс не перевищує , значить значення дійсно зустрічається серед міст з номерами від до .
Приклад
Розглянемо, як виглядатиме структура для першого прикладу.
p[123] = \{1\};
p[314] = \{3\};
p[434] = \{5\};
p[666] = \{2, 4\};
Наприклад, для обробки запиту (1, 5, 314) необхідно виконати наступні кроки:
Перевірити, чи існує масив ;
Потім, використовуючи бінарний пошук в масиві , знайти найменше значення, не менше l = 1. У даному випадку це число .
Оскільки воно не перевищує r = 5, відповідь на запит '1'.
Реалізація алгоритму
Оголосимо використовувані структури даних:
Масив зберігає статистичні дані про кількість перевезених трамваями людей;
Відображення містить для кожного значення , що зустрічається у вхідному масиві , список індексів (позицій), на яких це значення зустрічається.
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;