Advertisement
wery00

Untitled

Feb 3rd, 2023
829
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.94 KB | None | 0 0
  1. // 2018, Sayutin Dmitry.
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using std::cin;
  6. using std::cout;
  7. using std::cerr;
  8.  
  9. using std::vector;
  10. using std::map;
  11. using std::array;
  12. using std::set;
  13. using std::string;
  14.  
  15. using std::pair;
  16. using std::make_pair;
  17.  
  18. using std::tuple;
  19. using std::make_tuple;
  20. using std::get;
  21.  
  22. using std::min;
  23. using std::abs;
  24. using std::max;
  25.  
  26. using std::unique;
  27. using std::sort;
  28. using std::generate;
  29. using std::reverse;
  30. using std::min_element;
  31. using std::max_element;
  32.  
  33. #ifdef LOCAL
  34. #define LASSERT(X) assert(X)
  35. #else
  36. #define LASSERT(X) {}
  37. #endif
  38.  
  39. template <typename T>
  40. T input() {
  41.     T res;
  42.     cin >> res;
  43.     LASSERT(cin);
  44.     return res;
  45. }
  46.  
  47. template <typename IT>
  48. void input_seq(IT b, IT e) {
  49.     std::generate(b, e, input<typename std::remove_reference<decltype(*b)>::type>);
  50. }
  51.  
  52. #define SZ(vec)         int((vec).size())
  53. #define ALL(data)       data.begin(),data.end()
  54. #define RALL(data)      data.rbegin(),data.rend()
  55. #define TYPEMAX(type)   std::numeric_limits<type>::max()
  56. #define TYPEMIN(type)   std::numeric_limits<type>::min()
  57.  
  58. #define pb push_back
  59. #define eb emplace_back
  60.  
  61.  
  62. template <size_t buf_sz>
  63. struct in_reader {
  64.     in_reader(FILE* f): f(f) {}
  65.  
  66.     void set_err() {
  67.         err = true;
  68. #ifdef LOCAL
  69.         assert(false);
  70. #endif
  71.     }
  72.  
  73.     int peekch() {
  74.         if (term)
  75.             return EOF;
  76.         else if (l == r and r == buf_sz) {
  77.             l = 0;
  78.             r = fread(buf, 1, buf_sz, f);
  79.         }
  80.  
  81.         if (l != r)
  82.             return buf[l];
  83.         else {
  84.             term = true;
  85.             if (ferror(f))
  86.                 set_err();
  87.             return EOF;
  88.         }
  89.     }
  90.    
  91.     int getch() {
  92.         int res = peekch();
  93.         if (res != EOF)
  94.             ++l;
  95.         return res;
  96.     }
  97.  
  98.     void seek_token() {
  99.         while (peekch() != EOF and std::isspace(peekch()))
  100.             getch();
  101.     }
  102.    
  103.     template <typename T>
  104.     T input_int() {
  105.         seek_token();
  106.  
  107.         if (peekch() == EOF)
  108.             set_err();
  109.        
  110.         char ch = peekch();
  111.         bool positive = true;
  112.         if (ch == '+')
  113.             getch();
  114.         else if (ch == '-')
  115.             getch(), positive = false;
  116.         else if (not ('0' <= ch and ch <= '9')) {
  117.             set_err();
  118.             return 0;
  119.         }
  120.  
  121.         int num_read = 0;
  122.         T res = 0;
  123.         while ('0' <= peekch() and peekch() <= '9')
  124.             res = 10 * res + getch() - '0', ++num_read;
  125.  
  126.         if (num_read == 0)
  127.             set_err();
  128.         if (positive == false and res > 0 and not std::numeric_limits<T>::is_signed)
  129.             set_err();
  130.         if (positive == false)
  131.             res = -res;
  132.         return res;
  133.     }
  134.    
  135.     std::string input_string() {
  136.         seek_token();
  137.        
  138.         std::string res;
  139.         while (peekch() != EOF and not std::isspace(peekch()))
  140.             res += getch();
  141.         return res;
  142.     }
  143.  
  144.     template <typename T>
  145.     T input_float() {
  146.         seek_token();
  147.         size_t tmp_sz = 0;
  148.        
  149.         if (peekch() == '+' or peekch() == '-')
  150.             tmp[tmp_sz++] = getch();
  151.         while ('0' <= peekch() and peekch() <= '9' and tmp_sz != 60)
  152.             tmp[tmp_sz++] = getch();
  153.         if (peekch() == '.' and tmp_sz != 60) {
  154.             tmp[tmp_sz++] = getch();
  155.             while ('0' <= peekch() and peekch() <= '9' and tmp_sz != 60)
  156.                 tmp[tmp_sz++] = getch();
  157.         }
  158.  
  159.         if (tmp_sz == 60 or tmp_sz == 0) {
  160.             set_err();
  161.             return 0;
  162.         }
  163.         tmp[tmp_sz] = 0;
  164.         if (std::is_same<T, float>::value)
  165.             return strtof(tmp, NULL);
  166.         else if (std::is_same<T, double>::value)
  167.             return strtod(tmp, NULL);
  168.         else if (std::is_same<T, long double>::value)
  169.             return strtold(tmp, NULL);
  170.         else {
  171.             set_err();
  172.             return 0;
  173.         }
  174.     }
  175.    
  176.     void input_string_to(char* out, size_t mx) {
  177.         seek_token();
  178.         mx -= 1;
  179.        
  180.         while (peekch() != EOF and not std::isspace(peekch()) and mx != 0)
  181.             *(out++) = getch(), --mx;
  182.         *out = 0;
  183.     }
  184.    
  185.     char tmp[60];
  186.     char buf[buf_sz];
  187.     FILE* f;
  188.     size_t l = buf_sz;
  189.     size_t r = buf_sz;
  190.     bool term = false;
  191.     bool err  = false;
  192. };
  193.  
  194.  
  195. template <size_t buf_sz>
  196. struct out_writer {
  197.     out_writer(FILE* f): f(f) {}
  198.     ~out_writer() {flush();}
  199.    
  200.     void set_err() {
  201.         err = true;
  202. #ifdef LOCAL
  203.         assert(false);
  204. #endif
  205.     }
  206.  
  207.     void flush() {
  208.         if (pos == 0)
  209.             return;
  210.        
  211.         if (fwrite(buf, 1, pos, f) != pos)
  212.             set_err();
  213.         pos = 0;
  214.     }
  215.    
  216.     void putch(char ch) {
  217.         if (pos == buf_sz)
  218.             flush();
  219.         buf[pos++] = ch;
  220.     }
  221.  
  222.     template <typename T>
  223.     void write_int(T elem) {
  224.         if (elem < 0) {
  225.             putch('-');
  226.             elem = -elem;
  227.         }
  228.  
  229.         size_t tmp_sz = 0;
  230.         while (elem != 0)
  231.             tmp[tmp_sz++] = '0' + elem % 10, elem /= 10;
  232.        
  233.         if (tmp_sz == 0)
  234.             putch('0');
  235.         else
  236.             while (tmp_sz != 0)
  237.                 putch(tmp[--tmp_sz]);
  238.     }
  239.    
  240.     void write_string(const std::string& str) {
  241.         write_string_raw(str.data());
  242.     }
  243.  
  244.     template <typename T>
  245.     void write_float(T v) {
  246.         if (std::is_same<T, float>::value)
  247.             snprintf(tmp, 60, "%.7f", v);
  248.         else if (std::is_same<T, double>::value)
  249.             snprintf(tmp, 60, "%.7lf", v);
  250.         else if (std::is_same<T, long double>::value)
  251.             snprintf(tmp, 60, "%.7Lf", v);
  252.         else {
  253.             set_err();
  254.         }
  255.         write_string_raw(tmp);
  256.     }
  257.    
  258.     void write_string_raw(const char* out) {
  259.         while (*out != 0)
  260.             putch(*(out++));
  261.     }
  262.    
  263.     char tmp[60];
  264.     char buf[buf_sz];
  265.     FILE* f;
  266.     size_t pos = 0;
  267.     bool err = false;
  268. };
  269.  
  270. in_reader<4096> reader(stdin);
  271. out_writer<4096> writer(stdout);
  272.  
  273.  
  274. struct fast_t {
  275.     vector<tuple<int, int, int>> evs;
  276.     // add :: 0 r val
  277.     // del :: 1 r val
  278.     // que :: 2 min_r p_ans
  279.  
  280.     void add(int r, int val) {
  281.         evs.emplace_back(0, r, val);
  282.     }
  283.  
  284.     void rem(int r, int val) {
  285.         evs.emplace_back(1, r, val);
  286.     }
  287.  
  288.     void get_ans(int r, int p_ans) {
  289.         evs.emplace_back(2, r, p_ans);
  290.     }
  291.  
  292.     void solve(vector<int>& answers) {
  293.         vector<pair<int, int>> vals;
  294.         for (auto elem: evs)
  295.             if (get<0>(elem) == 0)
  296.                 vals.emplace_back(get<1>(elem), get<2>(elem));
  297.  
  298.         std::sort(ALL(vals));
  299.         vals.resize(std::unique(ALL(vals)) - vals.begin());
  300.  
  301.         if (vals.empty())
  302.             return;
  303.  
  304.         int sz = 1;
  305.         while (sz < SZ(vals))
  306.             sz *= 2;
  307.        
  308.         int tree[2 * sz];
  309.         std::fill(tree, tree + 2 * sz, TYPEMAX(int));
  310.  
  311.         auto get_ind = [&](int r, int val) {
  312.             return std::lower_bound(ALL(vals), make_pair(r, val)) - vals.begin();
  313.         };
  314.        
  315.         for (auto elem: evs) {
  316.             if (get<0>(elem) == 0) {
  317.                 int i = get_ind(get<1>(elem), get<2>(elem));
  318.  
  319.                 tree[sz + i] = get<2>(elem);
  320.  
  321.                 for (int j = (sz + i) / 2; j >= 1; j = j / 2)
  322.                     tree[j] = min(tree[2 * j], tree[2 * j + 1]);
  323.             } else if (get<0>(elem) == 1) {
  324.                 int i = get_ind(get<1>(elem), get<2>(elem));
  325.  
  326.                 tree[sz + i] = TYPEMAX(int);
  327.  
  328.                 for (int j = (sz + i) / 2; j >= 1; j = j / 2)
  329.                     tree[j] = min(tree[2 * j], tree[2 * j + 1]);
  330.             } else {
  331.                 int i = sz + get_ind(get<1>(elem), -1000);
  332.                 int j = 2 * sz - 1;
  333.  
  334.                 int p_ans = get<2>(elem);
  335.                
  336.                 while (i <= j) {
  337.                     if (i % 2 == 1)
  338.                         answers[p_ans] = min(answers[p_ans], tree[i]), ++i;
  339.                     if (j % 2 == 0)
  340.                         answers[p_ans] = min(answers[p_ans], tree[j]), --j;
  341.  
  342.                     i /= 2;
  343.                     j /= 2;
  344.                 }
  345.             }
  346.         }
  347.     }
  348. };
  349.  
  350. int main() {
  351.     // code here
  352.  
  353.     int n = reader.input_int<int>();
  354.     int q = reader.input_int<int>();
  355.     vector<int> a(n);
  356.  
  357.     vector<set<int>> where(n + 5);
  358.  
  359.     for (int i = 0; i != n; ++i) {
  360.         a[i] = reader.input_int<int>();
  361.  
  362.         if (a[i] < SZ(where))
  363.             where[a[i]].insert(i);
  364.     }
  365.  
  366.     vector<fast_t> fenw(n);
  367.  
  368.     auto add = [&](int l, int r, int val) {
  369.         for (; l < n; l = l | (l + 1)) {
  370.             fenw[l].add(r, val);
  371.         }  
  372.     };
  373.  
  374.     auto del = [&](int l, int r, int val) {
  375.         for (; l < n; l = l | (l + 1)) {
  376.             fenw[l].rem(r, val);
  377.         }  
  378.     };
  379.    
  380.     for (int i = 0; i < SZ(where); ++i) {
  381.         int start = 0;
  382.  
  383.         for (int elem: where[i]) {
  384.             if (start <= elem - 1)
  385.                 add(start, elem - 1, i);
  386.             start = elem + 1;
  387.         }
  388.  
  389.         if (start <= n - 1)
  390.             add(start, n - 1, i);
  391.     }
  392.  
  393.     vector<int> answers;
  394.    
  395.     for (int iter = 0; iter != q; ++iter) {
  396.         reader.seek_token();
  397.         if (reader.getch() == '!') {
  398.             int i = reader.input_int<int>() - 1;
  399.             int x = reader.input_int<int>();
  400.  
  401.             if (a[i] < SZ(where)) {
  402.                 auto it = where[a[i]].find(i);
  403.  
  404.                 int prev = (it == where[a[i]].begin() ? -1 : *std::prev(it));
  405.                 int next = (std::next(it) == where[a[i]].end() ? n : *std::next(it));
  406.  
  407.                 if (prev + 1 <= i - 1)
  408.                     del(prev + 1, i - 1, a[i]);
  409.                
  410.                 if (i + 1 <= next - 1)
  411.                     del(i + 1, next - 1, a[i]);
  412.  
  413.                 add(prev + 1, next - 1, a[i]);
  414.                 where[a[i]].erase(it);
  415.             }
  416.  
  417.             a[i] = x;
  418.  
  419.             if (a[i] < SZ(where)) {
  420.                 auto it = where[a[i]].insert(i).first;
  421.                
  422.                 int prev = (it == where[a[i]].begin() ? -1 : *std::prev(it));
  423.                 int next = (std::next(it) == where[a[i]].end() ? n : *std::next(it));
  424.  
  425.                 if (prev + 1 <= next - 1)
  426.                     del(prev + 1, next - 1, a[i]);
  427.  
  428.                 if (prev + 1 <= i - 1)
  429.                     add(prev + 1, i - 1, a[i]);
  430.  
  431.                 if (i + 1 <= next - 1)
  432.                     add(i + 1, next - 1, a[i]);
  433.             }
  434.         } else {
  435.             int l = reader.input_int<int>() - 1;
  436.             int r = reader.input_int<int>() - 1;
  437.  
  438.             answers.push_back(TYPEMAX(int));
  439.             for (; l >= 0; l = (l & (l + 1)) - 1) {
  440.                 fenw[l].get_ans(r, SZ(answers) - 1);
  441.             }
  442.         }
  443.     }
  444.  
  445.     for (auto& elem: fenw)
  446.         elem.solve(answers);
  447.  
  448.     for (auto elem: answers) {
  449.         writer.write_int(elem);
  450.         writer.putch('\n');
  451.     }
  452.    
  453.     return 0;
  454. }
  455.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement