From cfde1dabc2667c57468f82410621d586ac2fcad2 Mon Sep 17 00:00:00 2001
From: Bruno Freitas Tissei <bft15@inf.ufpr.br>
Date: Fri, 3 May 2019 16:43:16 -0300
Subject: [PATCH] Fix seg trees and dsu

Signed-off-by: Bruno Freitas Tissei <bft15@inf.ufpr.br>
---
 algorithms/structure/disjoint_set.cpp      | 24 +++++++++-------------
 algorithms/structure/lazy_segment_tree.cpp | 23 ++++++++++++---------
 algorithms/structure/segment_tree.cpp      | 23 ++++++++++++---------
 3 files changed, 36 insertions(+), 34 deletions(-)

diff --git a/algorithms/structure/disjoint_set.cpp b/algorithms/structure/disjoint_set.cpp
index be2dd24..1635131 100644
--- a/algorithms/structure/disjoint_set.cpp
+++ b/algorithms/structure/disjoint_set.cpp
@@ -8,17 +8,16 @@
 
 struct DisjointSet {
   int N;
-  vector<int> h, par, size;
+  vector<int> rank, par;
 
   Disjoint(int N) :
-    N(N), h(N), par(N), size(N)
+    N(N), rank(N), par(N)
   {}
 
   /// Initializes element x.
   void make_set(int x) {
     par[x] = x;
-    h[x] = 0;
-    size[x] = 1;
+    rank[x] = 0;
   }
 
   /// Returns set index from element x.
@@ -33,16 +32,13 @@ struct DisjointSet {
     x = find_set(x);
     y = find_set(y);
 
-    if (x == y)
-      return;
+    if (x != y) {
+      if (rank[x] > rank[y]) 
+        swap(x, y);
 
-    if (h[x] > h[y])
-      swap(x, y);
-
-    par[x] = y;
-    size[y] += size[x];
-
-    if (h[x] == h[y])
-      h[x]++;
+      par[x] = y;
+      if (rank[x] == rank[y]) 
+        rank[x]++;
+    }
   }
 };
diff --git a/algorithms/structure/lazy_segment_tree.cpp b/algorithms/structure/lazy_segment_tree.cpp
index aee0052..cd56303 100644
--- a/algorithms/structure/lazy_segment_tree.cpp
+++ b/algorithms/structure/lazy_segment_tree.cpp
@@ -6,11 +6,11 @@
 ///   query_tree  -> O(log n)
 /// Complexity (Space): O(n)
 
+int N;
 struct LazySegmentTree {
-  int N;
   vector<int> tree, lazy;
 
-  LazySegmentTree(int N, const vector<int> &v) : N(N), tree(N*4), lazy(N*4) {
+  LazySegmentTree(const vector<int> &v) : tree(MAX*4), lazy(MAX*4) {
     init();
     build(v);
   }
@@ -34,9 +34,10 @@ struct LazySegmentTree {
       return;
     }
 
-    build(v, left(node), a, (a + b) / 2);
-    build(v, right(node), (a + b) / 2 + 1, b);
-    tree[node] = tree[node * 2] + tree[node * 2 + 1];
+    int mid = (a + b) / 2;
+    build(v, left(node), a, mid);
+    build(v, right(node), mid + 1, b);
+    tree[node] = tree[left(node)] + tree[right(node)];
   }
 
   /// Propagates value to tree and through lazy tree.
@@ -70,9 +71,10 @@ struct LazySegmentTree {
       return;
     }
 
-    update(i, j, val, left(node), a, (a + b) / 2);
-    update(i, j, val, right(node), (a + b) / 2 + 1, b);
-    tree[node] = tree[node * 2] + tree[node * 2 + 1];
+    int mid = (a + b) / 2;
+    update(i, j, val, left(node), a, mid);
+    update(i, j, val, right(node), mid + 1, b);
+    tree[node] = tree[left(node)] + tree[right(node)];
   }
 
   /// Returns sum of [i,j].
@@ -87,8 +89,9 @@ struct LazySegmentTree {
     if (a >= i && b <= j)
       return tree[node];
 
-    int q1 = query(i, j, left(node), a, (a + b) / 2);
-    int q2 = query(i, j, right(node), (a + b) / 2 + 1, b);
+    int mid = (a + b) / 2;
+    int q1 = query(i, j, left(node), a, mid);
+    int q2 = query(i, j, right(node), mid + 1, b);
     return q1 + q2;
   }
 };
diff --git a/algorithms/structure/segment_tree.cpp b/algorithms/structure/segment_tree.cpp
index 568384c..6367e56 100644
--- a/algorithms/structure/segment_tree.cpp
+++ b/algorithms/structure/segment_tree.cpp
@@ -6,11 +6,11 @@
 ///   Query  -> O(log n)
 /// Complexity (Space): O(n)
 
+int N;
 struct SegmentTree {
-  int N;
   vector<int> tree;
 
-  SegmentTree(int N, const vector<int> &v) : N(N), tree(N*4) {
+  SegmentTree(const vector<int> &v) : tree(MAX*4) {
     init();
     build(v);
   }
@@ -33,9 +33,10 @@ struct SegmentTree {
       return;
     }
 
-    build(v, left(node), a, (a + b) / 2);
-    build(v, right(node), 1 + (a + b) / 2, b);
-    tree[node] = tree[node * 2] + tree[node * 2 + 1];
+    int mid = (a + b) / 2;
+    build(v, left(node), a, mid);
+    build(v, right(node), mid + 1, b);
+    tree[node] = tree[left(node)] + tree[right(node)];
   }
 
   /// Updates position idx by adding value val.
@@ -50,9 +51,10 @@ struct SegmentTree {
       return;
     }
 
-    update(idx, val, left(node), a, (a + b) / 2);
-    update(idx, val, right(node), 1 + (a + b) / 2, b);
-    tree[node] = tree[node * 2] + tree[node * 2 + 1];
+    int mid = (a + b) / 2;
+    update(idx, val, left(node), a, mid);
+    update(idx, val, right(node), mid + 1, b);
+    tree[node] = tree[left(node)] + tree[right(node)];
   }
 
   /// Returns sum of [i,j].
@@ -64,8 +66,9 @@ struct SegmentTree {
     if (i <= a && b <= j) 
       return tree[node];
 
-    int q1 = query(i, j, left(node), a, (a + b) / 2);
-    int q2 = query(i, j, right(node), 1 + (a + b) / 2, b);
+    int mid = (a + b) / 2;
+    int q1 = query(i, j, left(node), a, mid);
+    int q2 = query(i, j, right(node), mid + 1, b);
     return q1 + q2;
   }
 };
-- 
GitLab