zhukov000

Дерево отрезков (реализация)

Dec 11th, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const int N = 1 << 20;
  2.  
  3. struct seg_tree {
  4.     int t[N * 2 + 228];
  5.     int mod[N * 2 + 228];
  6.  
  7.     seg_tree() {
  8.  
  9.     }
  10.  
  11.     void build(vector<int> a) {
  12.         fill(t, t + N * 2, INF);
  13.         for (int i = 0; i < a.size(); ++i) {
  14.             t[i + N] = a[i];
  15.         }
  16.         for (int i = N - 1; i >= 0; --i) {
  17.             t[i] = min(t[i * 2], t[i * 2 + 1]);
  18.         }
  19.     }
  20.  
  21.     void chg(int i, int v) {
  22.         i += N;
  23.         t[i] = v;
  24.         while (i != 1) {
  25.             // t[i >> 1] = t[i] + t[i ^ 1];
  26.             i >>= 1;
  27.             t[i] = min(t[i * 2], t[i * 2 + 1]);
  28.         }
  29.     }
  30.  
  31.     void push(int i, int len) {
  32.         if (mod[i] != -1) {
  33.             if (i < N) {
  34.                 mod[i * 2] = mod[i];
  35.                 mod[i * 2 + 1] = mod[i];           
  36.             }
  37.             t[i] = mod[i];
  38.             mod[i] = -1;
  39.         }
  40.     }
  41.  
  42.     int get(int i, int L, int R, int Ln, int Rn) {
  43.         push(i, R - L);
  44.         if (Ln <= L && R <= Rn) {
  45.             return t[i];
  46.         }
  47.         if (Rn <= L || R <= Ln) {
  48.             return INF;
  49.         }
  50.         int M = (L + R) >> 1;
  51.         return min(get(i * 2,     L, M, Ln, Rn),  
  52.                    get(i * 2 + 1, M, R, Ln, Rn));
  53.     }
  54.  
  55.     int find(int i, int L, int R, int Ln, int Rn, int val) {
  56.         push(i, R - L);
  57.         if (Rn <= L || R <= Ln || t[i] >= val) return -1;
  58.         if (R - L == 1) return L;
  59.         int M = (L + R) >> 1;
  60.         int ans = find(i * 2, L, M, Ln, Rn, val);
  61.         if (ans == -1) {
  62.             ans = find(i * 2 + 1, M, R, Ln, Rn, val);
  63.         }
  64.         return ans;
  65.     }
  66.  
  67.     void chg(int i, int L, int R, int Ln, int Rn, int d) {
  68.         if (Ln <= L && R <= Rn) {
  69.             mod[i] = d;
  70.             push(i, R - L);
  71.             return;
  72.         }
  73.         push(i, R - L);
  74.         if (Rn <= L || R <= Ln) {
  75.             return;
  76.         }
  77.         int M = (L + R) >> 1;
  78.         chg(i * 2    , L, M, Ln, Rn, d);
  79.         chg(i * 2 + 1, M, R, Ln, Rn, d);
  80.         t[i] = min(t[i * 2], t[i * 2 + 1]);
  81.     }
  82. };
Add Comment
Please, Sign In to add comment