kdzhr

Тёплые воспоминания

Apr 2nd, 2020
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. // OK http://contest.uni-smr.ac.ru/ru/problemset/6353/
  2.  
  3. # include <iostream>
  4. # include <vector>
  5. # include <algorithm>
  6.  
  7. bool check(std::vector<std::vector<size_t>> &min_value, std::vector<std::vector<size_t>> &max_value,
  8.         std::vector<size_t> &p, size_t l, size_t r, size_t l_ex, size_t r_ex) {
  9.     size_t j = p[r - l + 1];
  10.     size_t min_el = std::min(min_value[l][j], min_value[r - ((1u << j) - 1)][j]);
  11.     size_t max_el = std::max(max_value[l][j], max_value[r - ((1u << j) - 1)][j]);
  12.     return min_el < (l_ex - 1) || max_el >= r_ex;
  13. }
  14. // included l_ex, included r_ex, enumerate from 1
  15.  
  16. int main() {
  17.     uint32_t n, q;
  18.     std::cin >> n >> q;
  19.     std::vector<std::pair<int32_t, size_t>> m(n + 1);
  20.     for (size_t i = 0; i < n; i++) {
  21.         int32_t a;
  22.         std::cin >> a;
  23.         m[i] = {a, i};
  24.     }
  25.     m[n] = {15700000, n - 1};
  26.     std::sort(m.begin(), m.end());
  27.     std::vector<size_t> p(n + 2);
  28.     p[1] = 0;
  29.     for (size_t i = 2; i <= (n + 1); i++) {
  30.         p[i] = p[i / 2] + 1;
  31.     }
  32.  
  33.     std::vector<std::vector<size_t>> min_value(n + 1, std::vector<size_t> (p[n + 1] + 1, INT32_MAX));
  34.     std::vector<std::vector<size_t>> max_value(n + 1, std::vector<size_t> (p[n + 1] + 1, INT32_MAX));
  35.  
  36.     for (size_t i = 0; i < (n + 1); i++) {
  37.         min_value[i][0] = m[i].second;
  38.         max_value[i][0] = m[i].second;
  39.     }
  40.  
  41.     for (size_t j = 1; j <= p[n + 1]; j++) {
  42.         for (size_t i = 0; i + (1u << j) <= (n + 1); i++) {
  43.             min_value[i][j] = std::min(min_value[i][j - 1], min_value[i + (1u << (j - 1))][j - 1]);
  44.             max_value[i][j] = std::max(max_value[i][j - 1], max_value[i + (1u << (j - 1))][j - 1]);
  45.         }
  46.     }
  47.     for (size_t i = 0; i < q; i++) {
  48.         size_t l, r;
  49.         int32_t x;
  50.         std::cin >> l >> r >> x;
  51.         // first bs, right req
  52.         int32_t left = -1;
  53.         int32_t right = (n + 1) - 1;
  54.         while (right - left > 1) {
  55.             size_t mid = (left + right) / 2;
  56.             if (x <= m[mid].first) {
  57.                 right = mid;
  58.             } else {
  59.                 left = mid;
  60.             }
  61.         }
  62.         size_t true_left_r = right;
  63.         left = right;
  64.         right = n + 1;
  65.         // right -> ++ans
  66.         while (right - left > 1) {
  67.             size_t mid = (left + right) / 2;
  68.             if (check(min_value, max_value, p, true_left_r, mid - 1, l, r)) {
  69.                 right = mid;
  70.             } else {
  71.                 left = mid;
  72.             }
  73.         }
  74.         std::cout << m[right - 1].first << '\n';
  75.     }
  76.     return 0;
  77. }
Add Comment
Please, Sign In to add comment