Advertisement
den4ik2003

Untitled

Nov 27th, 2021
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.77 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. const int size = 1e5 + 1;
  5. const int min = -1e9;
  6. const int max = 1e9;
  7. using std::cin;
  8. using std::cout;
  9. using std::vector;
  10.  
  11. void maxBuilding(vector<int>& tree, vector<int>& a, int v, int tl, int tr) {
  12.     if (tl == tr) {
  13.         tree[v] = a[tl];
  14.         return;
  15.     }
  16.     int tm = (tl + tr) >> 1;
  17.     maxBuilding(tree, a, 2 * v, tl, tm);
  18.     maxBuilding(tree, a, 2 * v + 1, tm + 1, tr); //мб тут нужна проверка того что сын существует
  19.     tree[v] = std::max(tree[2*v], tree[2*v + 1]);
  20. }
  21.  
  22. int getMax(vector<int>& tree, int v, int tl, int tr, int l, int r) {
  23.     if (tl == l && tr == r) {
  24.         return tree[v];
  25.     }
  26.     int tm = (tl + tr) >> 1;
  27.     int ans = min;
  28.     if (l <= tm) {
  29.         int temp_ans = getMax(tree, 2*v, tl, tm, l, std::min(r, tm));
  30.         ans = std::max(temp_ans, ans);
  31.     }
  32.     if (r >= tm + 1) {
  33.         int temp_ans = getMax(tree, 2*v + 1, tm + 1, tr, std::max(tm + 1, tl), r);
  34.         ans = std::max(temp_ans, ans);
  35.     }
  36.     return ans;
  37. }
  38.  
  39. void maxUpdate(vector<int>& tree, int v, int tl, int tr, int pos, int val) {
  40.     tree[v] = std::max(tree[v], val);
  41.     if (tl == tr) {
  42.         return;
  43.     }
  44.     int tm = (tl + tr) >> 1;
  45.     if (pos <= tm) {
  46.         maxUpdate(tree, 2*v, tl, tm, pos, val);
  47.     }  //а может можно и else
  48.     if (pos >= tm + 1) {
  49.         maxUpdate(tree, 2*v + 1, tm + 1, tr, pos, val);
  50.     }
  51. }
  52.  
  53. void minBuilding(vector<int>& tree, vector<int>& a, int v, int tl, int tr) {
  54.     if (tl == tr) {
  55.         tree[v] = a[tl];
  56.         return;
  57.     }
  58.     int tm = (tl + tr) >> 1;
  59.     minBuilding(tree, a, 2 * v, tl, tm);
  60.     minBuilding(tree, a, 2 * v + 1, tm + 1, tr); //мб тут нужна проверка того что сын существует
  61.     tree[v] = std::min(tree[2*v], tree[2*v + 1]);
  62. }
  63.  
  64. int getMin(vector<int>& tree, int v, int tl, int tr, int l, int r) {
  65.     if (tl == l && tr == r) {
  66.     return tree[v];
  67.     }
  68.     int tm = (tl + tr) >> 1;
  69.     int ans = max;
  70.     if (l <= tm) {
  71.         int temp_ans = getMin(tree, 2*v, tl, tm, l, std::min(r, tm));
  72.         ans = std::min(temp_ans, ans);
  73.     }
  74.     if (r >= tm + 1) {
  75.         int temp_ans = getMin(tree, 2*v + 1, tm + 1, tr, std::max(tm + 1, tl), r);
  76.         ans = std::min(temp_ans, ans);
  77.     }
  78.     return ans;
  79. }
  80.  
  81. void minUpdate(vector<int>& tree, int v, int tl, int tr, int pos, int val) {
  82.     tree[v] = std::min(tree[v], val);
  83.     if (tl == tr) {
  84.         return;
  85.     }
  86.     int tm = (tl + tr) >> 1;
  87.     if (pos <= tm) {
  88.         minUpdate(tree, 2*v, tl, tm, pos, val);
  89.     }  //а может можно и else
  90.     if (pos >= tm + 1) {
  91.         minUpdate(tree, 2*v + 1, tm + 1, tr, pos, val);
  92.     }
  93. }
  94.  
  95. int main() {
  96.     std::ios_base::sync_with_stdio(false);
  97.     cin.tie(0);
  98.     cout.tie(0);
  99.  
  100.     int m;
  101.     cin >> m;
  102.     vector<int> v(size + 1);
  103.     for (int i = 1; i <= size; i++) { //если i = 0 то будет ли разница?
  104.         int a = ((i % 12345) * (i % 12345)) % 12345;
  105.         int c = ((i % 23456) * (i % 23456)) % 23456;
  106.         int b = (c * (i % 23456)) % 23456;
  107.         v[i] = a + b;
  108.     }
  109.     vector<int> max_tree(4 * size);
  110.     maxBuilding(max_tree, v, 1, 0, size - 1);
  111.  
  112.     vector<int> min_tree(4 * size);
  113.     minBuilding(min_tree, v, 1, 0, size - 1);
  114.  
  115.     for (int i = 1; i <= m; i++) {
  116.         int xi, yi;
  117.         cin >> xi >> yi;
  118.         if (xi > 0) {
  119.             int maximum = getMax(max_tree, 1, 0, size, xi, yi);
  120.             int minimum = getMin(min_tree, 1, 0, size, xi, yi);
  121.             cout << maximum - minimum << "\n";
  122.         }
  123.         if (xi < 0) {
  124.             xi *= -1;
  125.             maxUpdate(max_tree, 1, 0, size, xi, yi);
  126.             minUpdate(min_tree, 1, 0, size, xi, yi);
  127.         }
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement