Advertisement
Hello_MMM

ф

Dec 13th, 2020
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. long long a[10000000];
  8. long long tree1[40000004];
  9. long long tree2[40000004];
  10.  
  11. long long get_max(long long l, long long r, long long v, long long tl, long long tr) {
  12.     if (l <= tl && tr <= r) {
  13.         return tree2[v];
  14.     }
  15.  
  16.     if (tr < l || r < tl) {
  17.         return 0;
  18.     }
  19.  
  20.     long long tm = (tl + tr) / 2;
  21.     return max(get_max(l, r, v * 2, tl, tm), get_max(l, r, v * 2 + 1, tm + 1, tr));
  22. }
  23.  
  24. //для нахождения суммы
  25. void build_tree(long long v, long long tl, long long tr) {
  26.     if (tl == tr) {
  27.         tree1[v] = a[tl];
  28.         tree2[v] = a[tl];
  29.     }
  30.     else {
  31.         int tm = (tl + tr) / 2;
  32.         build_tree(v * 2, tl, tm);
  33.         build_tree(v * 2 + 1, tm + 1, tr);
  34.         tree1[v] = tree1[v * 2] + tree1[v * 2 + 1];
  35.         tree2[v] = max(tree2[v * 2], tree2[v * 2 + 1]);
  36.     }
  37. }
  38.  
  39. long long get_sum(long long l, long long r, long long v, long long tl, long long tr) {
  40.     if (l <= tl && tr <= r) {
  41.         return tree1[v];
  42.     }
  43.  
  44.     if (tr < l || r < tl) {
  45.         return 0;
  46.     }
  47.  
  48.     long long tm = (tl + tr) / 2;
  49.     return get_sum(l, r, v * 2, tl, tm)
  50.         + get_sum(l, r, v * 2 + 1, tm + 1, tr);
  51. }
  52.  
  53. int main() {
  54.     ios_base::sync_with_stdio(false);
  55.     cin.tie(0);
  56.  
  57.     long long T;
  58.     cin >> T;
  59.  
  60.     for (int smth = 0; smth < T; smth++) {
  61.         long long n, m;
  62.         cin >> n >> m;
  63.  
  64.         //считывание
  65.         for (int i = 0; i < n; i++)
  66.             cin >> a[i];
  67.  
  68.         //построение дерева
  69.         build_tree(1, 0, n - 1);
  70.  
  71.         //обработка событий
  72.         for (int e = 0; e < m; e++) {
  73.             long long x, y;
  74.             char ch;
  75.             cin >> ch >> x >> y;
  76.             if (ch == 111) {
  77.                 long long t;
  78.                 cin >> t;
  79.  
  80.                 for (int i = (x-1); i <= (y-1); i++) {
  81.                     a[i] = min(a[i], t);
  82.                 }
  83.  
  84.                 build_tree(1, 0, n - 1);
  85.             }
  86.             else if (ch == 109) {
  87.                 cout << get_max(x-1, y-1, 1, 0, n - 1) << "\n";
  88.             }
  89.             else {
  90.                 cout << get_sum(x-1, y-1, 1, 0, n - 1) << "\n";
  91.             }
  92.         }
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement