равный на отрезке
Условие
Дан массив и запросы вида . Ответ на каждый запрос 1/0 "есть ли равный на отрезке .
Примеры
входные данные | выходные данные |
---|---|
5 123 666 314 666 434 5 1 5 314 1 5 578 2 4 666 4 4 713 1 1 123 | 10101 |
Решение
Решение
Пусть все запросы были с одинаковым . Тогда в массиве все элементы не равные нас не интересует.
Рассмотрим массив из индексов на которых числа равны . Тогда запрос можно трансформировать в новый "есть ли в этом массиве числа в диапазоне ". Это можно сделать одним бинпоиском. Найдём первое число, которое не меньше и проверим, что оно не больше .
Такой массив для каждого числа можно построить используя словарь, но на самом деле можно воспользоваться бинпоиском. Сделаем массив уникальных чисел (сортировка + удаление повторяющихся). Сделаем вектор векторов, где -ый вектор хранит все индексы равные .
void solve() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
auto b = a;
{
sort(b.begin(), b.end());
b.resize(unique(b.begin(), b.end()) - b.begin());
}
vector<vector<int>> pos(b.size());
for (int i = 0; i < n; i++) {
int j = lower_bound(b.begin(), b.end(), a[i]) - b.begin();
pos[j].push_back(i);
}
int q;
cin >> q;
while (q--) {
int l, r, x;
cin >> l >> r >> x;
l--, r--;
int j = lower_bound(b.begin(), b.end(), x) - b.begin();
if (b[j] != x) {
cout << 0;
continue;
}
auto& ind = pos[j];
auto it = lower_bound(ind.begin(), ind.end(), l);
if (it == ind.end()) {
cout << 0;
continue;
}
cout << ((*it) <= r);
}
}