равный на отрезке

Условие задачи

Условие

Дан массив и запросы вида . Ответ на каждый запрос 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);
  }
}