Guest User

RMQ с прибавлением на отрезке. Динамическая структура.

a guest
Apr 12th, 2012
536
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. #define MAX_N 100000
  7. #define INFIN 1000000
  8.  
  9. int N;
  10. int Ar[MAX_N];
  11.  
  12. struct rmq {
  13.     int Max;
  14.     int Add;
  15.     int L, R;
  16.     rmq *lt, *rt;
  17.     rmq() {
  18.         Max = 0;
  19.         lt = rt = NULL;
  20.     }
  21.     rmq(int l, int r) {
  22.         L = l, R = r;
  23.         Add = 0;
  24.         if (l == r) {
  25.             Max = Ar[l];
  26.             lt = rt = NULL;
  27.             return;
  28.         }
  29.         int m = (l + r) / 2;
  30.         lt = new rmq(l , m);
  31.         rt = new rmq(m + 1, r);
  32.         Max = max(lt->Max, rt->Max);
  33.     }
  34.     int getMax(int l, int r) {
  35.         if (r < L || R < l)
  36.             return -INFIN;
  37.         if (l <= L && R <= r)
  38.             return Max + Add;
  39.         return max(lt->getMax(l,r), rt->getMax(l,r)) + Add;
  40.     }
  41.     void change(int pos, int val) {
  42.         if (L > pos || R < pos)
  43.             return;
  44.         if (L == R) {
  45.             Max = val + Add;
  46.             return;
  47.         }
  48.         lt->change(pos, val), rt->change(pos, val);
  49.         Max = max(lt->Max, rt->Max);
  50.     }
  51.     void add(int l, int r, int a) {
  52.         if (r < L || R < l)
  53.             return;
  54.         if (l <= L && R <= r)
  55.             Add += a;
  56.         else
  57.             lt->add(l,r,a), rt->add(l,r,a);
  58.     }
  59.     ~rmq() {
  60.         if (lt)
  61.             delete lt;
  62.         if (rt)
  63.             delete rt;
  64.     }
  65. };
  66.  
  67. int main () {
  68.     rmq *root = new rmq(0, N -1);
  69.     delete root;
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment