From 8e1787eaab9ae029db5bd2310d6b72b05bf1da7a Mon Sep 17 00:00:00 2001
From: fmkiotheka <fmkiotheka@inf.ufpr.br>
Date: Sun, 15 Oct 2023 23:04:09 -0300
Subject: [PATCH] =?UTF-8?q?Melhora=20c=C3=B3digo?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 fontes/2-sat.h                                |  4 +-
 fontes/aho-corasick.h                         |  4 +-
 fontes/angular-sweep.h                        |  4 +-
 fontes/chinese-remainder-theorem.h            |  3 +-
 fontes/coordinate-compression.h               |  2 +-
 fontes/dijkstra.h                             | 21 +++--
 fontes/dinic.h                                |  6 +-
 fontes/eulerian-path.h                        |  5 +-
 fontes/ford-fulkerson-edmons-karp-min-cost.h  |  4 +-
 fontes/ford-fulkerson-edmons-karp.h           |  4 +-
 fontes/gauss.h                                |  3 +-
 .../generalized-chinese-remainder-theorem.h   |  4 +-
 fontes/graham.h                               |  8 +-
 fontes/hash.sh                                |  2 +-
 fontes/interval-set.h                         |  6 +-
 fontes/karatsuba.h                            | 22 ++---
 fontes/kd-tree.h                              | 32 ++++----
 fontes/kosaraju.h                             | 32 ++++----
 fontes/kruskal.h                              | 28 +++----
 fontes/lca-offline.h                          |  3 +-
 fontes/mean-median.h                          | 12 +--
 fontes/merge-sort.h                           |  2 +-
 fontes/mex.h                                  |  6 +-
 fontes/miller-rabin.h                         |  8 +-
 fontes/mo-algorithm.h                         |  2 +-
 fontes/monotone.h                             |  4 +-
 fontes/next-combination.h                     |  4 +-
 fontes/numbers.h                              |  5 +-
 fontes/optimal-schedule-jobs.h                |  4 +-
 fontes/parquet.h                              |  2 +-
 fontes/point-in-polygon.h                     |  2 +-
 fontes/polygon-lattice-points.h               |  9 +--
 fontes/prim.h                                 |  2 +-
 fontes/remove-deque.h                         |  2 +-
 fontes/segment.h                              |  2 +-
 fontes/sieve.h                                |  4 +-
 fontes/sparse-table.h                         |  6 +-
 fontes/spfa.h                                 | 27 +++----
 fontes/stable-matching.h                      | 18 ++---
 fontes/stoer-wagner.h                         | 17 ++--
 fontes/suffix-array-radix.h                   |  4 +-
 fontes/suffix-array.h                         |  4 +-
 fontes/suffix-automaton.h                     |  2 +-
 fontes/suffix-tree.h                          | 81 +++++++++----------
 fontes/topological-order.h                    |  2 +-
 fontes/tree-square-root-decomposition.h       | 36 ++++-----
 fontes/trie.h                                 |  4 +-
 47 files changed, 228 insertions(+), 240 deletions(-)

diff --git a/fontes/2-sat.h b/fontes/2-sat.h
index fb0be41..013e40f 100644
--- a/fontes/2-sat.h
+++ b/fontes/2-sat.h
@@ -28,10 +28,10 @@ int solve2sat(int n) {
   }
   for (int u = 0; u < n; u++) {
     if (rep[2*u] == rep[2*u+1])
-      return false;
+      return 0;
     val[u] = rep[2*u] > rep[2*u+1];
   }
-  return true;
+  return 1;
 }
 
 void add_implies(int a, bool na, int b, bool nb) {
diff --git a/fontes/aho-corasick.h b/fontes/aho-corasick.h
index 3bde3c3..595163e 100644
--- a/fontes/aho-corasick.h
+++ b/fontes/aho-corasick.h
@@ -3,7 +3,7 @@ struct node {
   vector<int> nxt, go, ix;
   node() : p (0), pc (0), depth (-1),
   lnk (-1), out (-1), occ (0),
-  leaf (false), nxt (S, -1), go (S, -1) {}
+  leaf (0), nxt (S, -1), go (S, -1) {}
 };
 
 vector<node> aca (1);
@@ -18,7 +18,7 @@ void ins(string ne, int ix) {
     }
     u = aca[u].nxt[ch];
   }
-  aca[u].leaf = true;
+  aca[u].leaf = 1;
   aca[u].ix.push_back(ix);
 }
 
diff --git a/fontes/angular-sweep.h b/fontes/angular-sweep.h
index 99a7566..b036af5 100644
--- a/fontes/angular-sweep.h
+++ b/fontes/angular-sweep.h
@@ -2,13 +2,13 @@ int get_points_inside(int i, double r, int n) {
   vector<double> ang;
   for (int j = 0; j < n; j++)
     if (i != j && d[i][j] <= 2*r) {
-      double a = atan2(p[j].py - p[i].py, p[j].px - p[i].px);
+      double a = atan2(p[j].py-p[i].py, p[j].px-p[i].px);
       double b = acos(d[i][j]/(2*r));
       ang.push_back(dbi(a - b, j));
       ang.push_back(dbi(a + b, j));
     }
 
-  sort(ang.begin(), ang.end());
+  sort(begin(ang), end(ang));
 
   int count = 1, res = 1;
   for (auto angle : ang) {
diff --git a/fontes/chinese-remainder-theorem.h b/fontes/chinese-remainder-theorem.h
index 266a3a2..958010d 100644
--- a/fontes/chinese-remainder-theorem.h
+++ b/fontes/chinese-remainder-theorem.h
@@ -3,7 +3,8 @@ ll crt(vector<ll> a, vector<ll> m, int t) {
   ll ans = 0;
   for (int i = 0; i < t; i++) {
     ll pp = p / m[i];
-    ans = (ans + ((a[i] * inv(pp, m[i])) % p * pp) % p) % p;
+    ans += ((a[i] * inv(pp, m[i])) % p * pp) % p;
+    ans %= p;
   }
   return ans;
 }
diff --git a/fontes/coordinate-compression.h b/fontes/coordinate-compression.h
index 2629931..f4202db 100644
--- a/fontes/coordinate-compression.h
+++ b/fontes/coordinate-compression.h
@@ -1,5 +1,5 @@
 void compress(vector<int>& v, vector<int>& cv) {
-  set<int> vs (v.begin(), v.end());
+  set<int> vs (begin(v), end(v));
   map<int, int> to, fm;
   int ix = 0;
   for (int i : vs) { to[i] = ix; fm[ix] = i; ix++; }
diff --git a/fontes/dijkstra.h b/fontes/dijkstra.h
index 8ebebe1..efa8912 100644
--- a/fontes/dijkstra.h
+++ b/fontes/dijkstra.h
@@ -1,23 +1,20 @@
-vector<ll> d (N); vector<bool> vis (N);
-vector<vector<int>> dag (N);
-
-void dijkstra(int src, int dest) {
-  fill(d.begin(), d.end(), oo);
-  fill(vis.begin(), vis.end(), false);
-  priority_queue<ii, vector<ii>, greater<ii>> Q;
+void dijkstra(int src, int dest, int n) {
+  vector<ll> d (n, oo); vector<bool> vis (n);
+  vector<vector<int>> dag (n);
+  priority_queue<ii, vector<ii>, greater<ii>> q;
   d[src] = 0;
-  Q.push({0, src});
-  while (!Q.empty()) {
-    auto [c, u] = Q.top(); Q.pop();
+  q.push({0, src});
+  while (!q.empty()) {
+    auto [c, u] = q.top(); q.pop();
     if (vis[u]) { continue; }
-    vis[u] = true;
+    vis[u] = 1;
     for (auto [v, w] : gt[u]) if (d[u] == d[v] + w)
       dag[v].push_back(u);
     if (u == dest) { break; }
     for (auto [v, w] : g[u])
       if (d[v] > d[u] + w) {
         d[v] = d[u] + w;
-        Q.push({d[v], v});
+        q.push({d[v], v});
       }
   }
 }
diff --git a/fontes/dinic.h b/fontes/dinic.h
index 2bda29f..bc9a9ef 100644
--- a/fontes/dinic.h
+++ b/fontes/dinic.h
@@ -33,7 +33,8 @@ ll dfs(int u, int t, ll pushed) {
     int v = edges[i].v;
     if (level[u] + 1 != level[v]) { continue; }
     if (edges[i].cap - edges[i].flow < 1) { continue; }
-    ll tr = dfs(v, t, min(pushed, edges[i].cap - edges[i].flow));
+    ll tr = dfs(v, t,
+        min(pushed, edges[i].cap - edges[i].flow));
     if (tr == 0) { continue; }
     edges[i].flow += tr;
     edges[i^1].flow -= tr;
@@ -49,7 +50,8 @@ ll dinic /* O(EV^2) */(int s, int t) {
     level[s] = 0; q.push(s);
     if (!minimum_path(s, t)) { break; }
     fill(begin(ptr), end(ptr), 0);
-    while (ll pushed = dfs(s, t, oo)) { max_flow += pushed; }
+    while (ll pushed = dfs(s, t, oo))
+      max_flow += pushed;
   }
   return max_flow;
 }
diff --git a/fontes/eulerian-path.h b/fontes/eulerian-path.h
index c25c3fa..f46d207 100644
--- a/fontes/eulerian-path.h
+++ b/fontes/eulerian-path.h
@@ -1,5 +1,6 @@
 vector<int> eulerian_path(int src, int n) {
-  for (int u = 0; u < n; u++) if (deg[u] % 2) { return {}; }
+  for (int u = 0; u < n; u++)
+    if (deg[u] % 2) { return {}; }
   stack<int> st; st.push(src);
   vector<int> res;
   while (!st.empty()) {
@@ -15,6 +16,6 @@ vector<int> eulerian_path(int src, int n) {
     }
   }
   for (int u = 0; u < n; u++) if (g[u].size()) { return {}; }
-  reverse(res.begin(), res.end());
+  reverse(begin(res), end(res));
   return res;
 }
diff --git a/fontes/ford-fulkerson-edmons-karp-min-cost.h b/fontes/ford-fulkerson-edmons-karp-min-cost.h
index 5490dd1..8430ead 100644
--- a/fontes/ford-fulkerson-edmons-karp-min-cost.h
+++ b/fontes/ford-fulkerson-edmons-karp-min-cost.h
@@ -11,8 +11,8 @@ void link(int u, int v, int cap, int cost) {
 }
 
 bool minimum_path(int s, int t) {
-  fill(dist.begin(), dist.end(), oo); dist[s] = 0;
-  queue<int> q; q.push(s);
+  fill(begin(dist), end(dist), oo);
+  queue<int> q; q.push(s); dist[s] = 0;
   while (!q.empty()) {
     int u = q.front(); q.pop();
     queu[u] = 0;
diff --git a/fontes/ford-fulkerson-edmons-karp.h b/fontes/ford-fulkerson-edmons-karp.h
index a811d8a..23a22d7 100644
--- a/fontes/ford-fulkerson-edmons-karp.h
+++ b/fontes/ford-fulkerson-edmons-karp.h
@@ -9,8 +9,8 @@ void link(int u, int v, int c) {
 }
 
 bool minimum_path(int s, int t) {
-  fill(dist.begin(), dist.end(), oo); dist[s] = 0;
-  queue<int> q; q.push(s);
+  fill(begin(dist), end(dist), oo);
+  queue<int> q; q.push(s); dist[s] = 0;
   while (!q.empty()) {
     int u = q.front(); q.pop();
     if (u == t) { break; }
diff --git a/fontes/gauss.h b/fontes/gauss.h
index b33a322..2abfb8c 100644
--- a/fontes/gauss.h
+++ b/fontes/gauss.h
@@ -1,5 +1,6 @@
 template<typename T>
-pair<int, vector<T>> gauss(vector<vector<T>> a, vector<T> b) {
+pair<int, vector<T>> gauss(
+    vector<vector<T>> a, vector<T> b) {
   const double eps = 1e-6;
   int n = a.size(), m = a[0].size();
   for (int i = 0; i < n; i++) a[i].push_back(b[i]);
diff --git a/fontes/generalized-chinese-remainder-theorem.h b/fontes/generalized-chinese-remainder-theorem.h
index d097994..6fb5fc5 100644
--- a/fontes/generalized-chinese-remainder-theorem.h
+++ b/fontes/generalized-chinese-remainder-theorem.h
@@ -1,4 +1,6 @@
-ll norm(ll a, ll b) { a %= b; return (a < 0) ? a + b : a; }
+ll norm(ll a, ll b) {
+    a %= b; return (a < 0) ? a + b : a;
+}
 
 pair<ll, ll> crt_single(ll a, ll n, ll b, ll m) {
     ll x, y; ll g = extgcd(n, m, x, y);
diff --git a/fontes/graham.h b/fontes/graham.h
index 5c488d1..b204e5c 100644
--- a/fontes/graham.h
+++ b/fontes/graham.h
@@ -1,8 +1,8 @@
-vector<pt> convex_hull(vector<pt>& ps, bool col = false) {
-  pt p0 = *min_element(ps.begin(), ps.end(), [](pt a, pt b) {
+vector<pt> convex_hull(vector<pt>& ps, bool col = 0) {
+  pt p0 = *min_element(begin(ps), end(ps), [](pt a, pt b) {
     return make_pair(a.py, a.px) < make_pair(b.py, b.px);
   });
-  sort(ps.begin(), ps.end(), [&p0](pt a, pt b) {
+  sort(begin(ps), end(ps), [&p0](pt a, pt b) {
     int o = seg_ornt(p0, a, b);
     return o < 0 || (o == 0 && norm(p0 - a) < norm(p0 - b));
   });
@@ -10,7 +10,7 @@ vector<pt> convex_hull(vector<pt>& ps, bool col = false) {
     int i = ps.size(); i--;
     while (i >= 0 && seg_ornt(p0, ps[i], ps.back()) == 0)
       i--;
-    reverse(ps.begin()+i+1, ps.end());
+    reverse(begin(ps)+i+1, end(ps));
   }
   vector<pt> ans; for (int i = 0; i < ps.size(); i++) {
     while (ans.size() > 1 && !ccw(
diff --git a/fontes/hash.sh b/fontes/hash.sh
index 0e1e9cb..3990611 100644
--- a/fontes/hash.sh
+++ b/fontes/hash.sh
@@ -1,2 +1,2 @@
 sed -n $2','$3' p' $1 | sed '/^#w/d' | cpp -dD -P \
-  -fpreprocessed | tr -d '[:space:]' | md5sum | cut -c -6
+  -fpreprocessed | tr -d '[:space:]' | md5sum | cut -c -3
diff --git a/fontes/interval-set.h b/fontes/interval-set.h
index c723497..818d3a7 100644
--- a/fontes/interval-set.h
+++ b/fontes/interval-set.h
@@ -12,12 +12,12 @@ set<itvl, less<>> si;
 void ins_in(itvl in) {
   auto it = si.lower_bound(in);
   int a = in.a, b = in.b, c = in.c;
-  if (si.size() > 0 && it != si.begin()
+  if (si.size() > 0 && it != begin(si)
       && prev(it)->b+1 == a && prev(it)->c == c) {
     auto prv = prev(it); int prva = prv->a;
     si.erase(prv); a = prva;
   }
-  if (it != si.end() && c == it->c && b+1 == it->a) {
+  if (it != end(si) && c == it->c && b+1 == it->a) {
     int nxtb = it->b; si.erase(it); b = nxtb;
   }
   si.insert(itvl(a, b, c));
@@ -25,7 +25,7 @@ void ins_in(itvl in) {
 
 void upd_color(int a, int b, int c) {
   auto it = si.lower_bound(b);
-  if (it != si.end()) {
+  if (it != end(si)) {
     itvl ori = *it; si.erase(it);
     if (ori.a < a) { ins_in(itvl(ori.a, a-1, v)); }
     if (ori.b > b) { ins_in(itvl(b+1, ori.b, v)); }
diff --git a/fontes/karatsuba.h b/fontes/karatsuba.h
index cb0e33b..b9b60e4 100644
--- a/fontes/karatsuba.h
+++ b/fontes/karatsuba.h
@@ -9,19 +9,19 @@ vector<ll> karatsuba(const vector<ll> &a,
     return res;
   }
   int k = n >> 1;
-  vector<ll> a1(a.begin(), a.begin() + k);
-  vector<ll> a2(a.begin() + k, a.end());
-  vector<ll> b1(b.begin(), b.begin() + k);
-  vector<ll> b2(b.begin() + k, b.end());
+  vector<ll> a1(begin(a), begin(a)+k);
+  vector<ll> a2(begin(a)+k, end(a));
+  vector<ll> b1(begin(b), begin(b)+k);
+  vector<ll> b2(begin(b)+k, end(b));
   vector<ll> a1b1 = karatsuba(a1, b1);
   vector<ll> a2b2 = karatsuba(a2, b2);
-  for (int i = 0; i < k; i++) a2[i] += a1[i];
-  for (int i = 0; i < k; i++) b2[i] += b1[i];
+  for (int i=0; i < k; i++) a2[i] += a1[i];
+  for (int i=0; i < k; i++) b2[i] += b1[i];
   vector<ll> r = karatsuba(a2, b2);
-  for (int i = 0; i < a1b1.size(); i++) r[i] -= a1b1[i];
-  for (int i = 0; i < a2b2.size(); i++) r[i] -= a2b2[i];
-  for (int i = 0; i < r.size(); i++) res[i+k] += r[i];
-  for (int i = 0; i < a1b1.size(); i++) res[i] += a1b1[i];
-  for (int i = 0; i < a2b2.size(); i++) res[i+n] += a2b2[i];
+  for (int i=0; i < a1b1.size(); i++) r[i] -= a1b1[i];
+  for (int i=0; i < a2b2.size(); i++) r[i] -= a2b2[i];
+  for (int i=0; i < r.size(); i++) res[i+k] += r[i];
+  for (int i=0; i < a1b1.size(); i++) res[i] += a1b1[i];
+  for (int i=0; i < a2b2.size(); i++) res[i+n] += a2b2[i];
   return res;
 }
diff --git a/fontes/kd-tree.h b/fontes/kd-tree.h
index 469eec8..ec3db72 100644
--- a/fontes/kd-tree.h
+++ b/fontes/kd-tree.h
@@ -9,12 +9,12 @@ struct kdtree {
     double dist_sq(const pt& o) { return norm(o - p); }
     pt p; node* left, *right;
   };
-  node* root = nullptr;
+  node* root = 0;
   vector<double> best;
   vector<node> t;
 
-  struct node_cmp {
-    node_cmp(size_t _index) : ix(_index) {}
+  struct cmp {
+    cmp(size_t _index) : ix(_index) {}
     bool operator()(const node& n1, const node& n2) {
       return get_ii(n1.p, ix) < get_ii(n2.p, ix);
     }
@@ -22,10 +22,9 @@ struct kdtree {
   };
 
   node* make_tree(size_t begin, size_t end, size_t ix) {
-    if (end <= begin)
-      return nullptr;
+    if (end <= begin) { return 0; }
     size_t n = begin + (end - begin)/2;
-    nth_element(&t[begin], &t[n], &t[0] + end, node_cmp(ix));
+    nth_element(&t[begin], &t[n], &t[0] + end, cmp(ix));
     ix = (ix + 1) % 2;
     t[n].left = make_tree(begin, n, ix);
     t[n].right = make_tree(n + 1, end, ix);
@@ -36,30 +35,27 @@ struct kdtree {
     if (r == nullptr)
       return;
     double d = r->dist_sq(p);
-    if (best.size() < k || d < best[best.size()-1]) {
+    if (best.size() < k || d < best.back()) {
       best.push_back(d);
-      sort(best.begin(), best.end());
+      sort(begin(best), end(best));
       if (best.size() > k)
-        best.erase(best.begin() + k, best.end());
+        best.erase(begin(best)+k, end(best));
     }
-    if (best.size() == 0)
-      return;
+    if (best.size() == 0) { return; }
     double dx = get_ii(r->p, ix) - get_ii(p, ix);
     ix = (ix + 1) % 2;
     nearest_k(dx > 0 ? r->left : r->right, p, ix, k);
-    if (dx * dx >= best[best.size()-1])
-      return;
+    if (dx * dx >= best[best.size()-1]) { return; }
     nearest_k(dx > 0 ? r->right : r->left, p, ix, k);
   }
 
   template<typename iterator>
-    kdtree(iterator begin, iterator end) : t(begin, end) {
-      root = make_tree(0, t.size(), 0);
-    }
+  kdtree(iterator begin, iterator end) : t(begin, end) {
+    root = make_tree(0, t.size(), 0);
+  }
 
   double nearest_k(const pt& p, int k) {
-    if (root == nullptr)
-      throw logic_error("tree is empty");
+    if (root == 0) { throw logic_error("empty tree"); }
     best.clear();
     nearest_k(root, p, 0, k);
     double acc = 0;
diff --git a/fontes/kosaraju.h b/fontes/kosaraju.h
index 6ca7baa..1a4d62a 100644
--- a/fontes/kosaraju.h
+++ b/fontes/kosaraju.h
@@ -3,26 +3,26 @@ vector<int> vis (N), rep (N);
 stack<int> sinks;
 
 void fill_stack(int u) {
-    if (vis[u] == cts) { return; }
-    vis[u] = cts;
-    for (int v : g_t[u]) { fill_stack(v); }
-    sinks.push(u);
+  if (vis[u] == cts) { return; }
+  vis[u] = cts;
+  for (int v : g_t[u]) { fill_stack(v); }
+  sinks.push(u);
 }
 
 void mark_component(int u, int r) {
-    if (vis[u] == cts) { return; }
-    vis[u] = cts; rep[u] = r;
-    for (int v : g[u]) { mark_component(v, r); }
+  if (vis[u] == cts) { return; }
+  vis[u] = cts; rep[u] = r;
+  for (int v : g[u]) { mark_component(v, r); }
 }
 
 stack<int> kosaraju(int n) {
-    for (int u = 0; u < n; u++) { fill_stack(u); }
-    cts++;
-    stack<int> topo;
-    while (!sinks.empty()) {
-        int u = sinks.top(); sinks.pop();
-        mark_component(u, u);
-        if (rep[u] == u) topo.push(u);
-    }
-    return topo;
+  for (int u = 0; u < n; u++) { fill_stack(u); }
+  cts++;
+  stack<int> topo;
+  while (!sinks.empty()) {
+    int u = sinks.top(); sinks.pop();
+    mark_component(u, u);
+    if (rep[u] == u) topo.push(u);
+  }
+  return topo;
 }
diff --git a/fontes/kruskal.h b/fontes/kruskal.h
index 37b3bb4..7d0c55b 100644
--- a/fontes/kruskal.h
+++ b/fontes/kruskal.h
@@ -1,20 +1,20 @@
 struct edge {
-    int u, v, w;
-    bool operator<(struct edge &o) { return w < o.w; }
+  int u, v, w;
+  bool operator<(struct edge &o) { return w < o.w; }
 };
 
 int kruskal(int n) {
-    sort(edges.begin(), edges.end());
-    ds_init(n);
-    int components = n;
-    ll sum = 0;
-    for (auto [u, v, w] : edges) {
-        if (components == 1) { break; }
-        if (ds_find(u) != ds_find(v)) {
-            ds_union(u, v);
-            components--;
-            sum += w;
-        }
+  sort(begin(edges), end(edges));
+  ds_init(n);
+  int components = n;
+  ll sum = 0;
+  for (auto [u, v, w] : edges) {
+    if (components == 1) { break; }
+    if (ds_find(u) != ds_find(v)) {
+      ds_union(u, v);
+      components--;
+      sum += w;
     }
-    return sum;
+  }
+  return sum;
 }
diff --git a/fontes/lca-offline.h b/fontes/lca-offline.h
index ee011d3..5f00b8e 100644
--- a/fontes/lca-offline.h
+++ b/fontes/lca-offline.h
@@ -2,8 +2,7 @@ vector<vector<int>> queries (N);
 vector<int> anc (N); vector<bool> vis (N);
 
 void dfs(int u) {
-  vis[u] = true;
-  anc[u] = u;
+  vis[u] = 1; anc[u] = u;
   for (int v : adj[u]) if (!vis[v]) {
     dfs(v);
     ds_unite(u, v);
diff --git a/fontes/mean-median.h b/fontes/mean-median.h
index fe0a4de..e92d510 100644
--- a/fontes/mean-median.h
+++ b/fontes/mean-median.h
@@ -14,8 +14,10 @@ void get_mean_med(vector<int> a) {
     for (int it = 0; it < 100; it++) {
       double mi = (lo+hi)/2;
       vector<double> b (n);
-      for (int i = 0; i < n; i++) { b[i] = a[i] - mi; }
-      if (solve(mi, b) >= 0) { lo = mi; } else { hi = mi; }
+      for (int i = 0; i < n; i++)
+        b[i] = a[i] - mi;
+      if (solve(mi, b) >= 0) { lo = mi; }
+      else { hi = mi; }
     }
     mean = lo;
   }
@@ -24,10 +26,10 @@ void get_mean_med(vector<int> a) {
     for (int it = 0; it < 100; it++) {
       double mi = (lo+hi)/2;
       vector<double> b (n);
-      for (int i = 0; i < n; i++) {
+      for (int i = 0; i < n; i++)
         b[i] = (a[i] >= mi) ? +1 : -1;
-      }
-      if (solve(mi, b) > 0) { lo = mi; } else { hi = mi; }
+      if (solve(mi, b) > 0) { lo = mi; }
+      else { hi = mi; }
     }
     med = lo;
   }
diff --git a/fontes/merge-sort.h b/fontes/merge-sort.h
index b13da7a..fedf3dc 100644
--- a/fontes/merge-sort.h
+++ b/fontes/merge-sort.h
@@ -13,5 +13,5 @@ void merge_sort(int l, int r) {
     } else if (i < mi) { aux[k] = a[i++]; }
     else { aux[k] = a[j++]; }
   }
-  copy(aux.begin(), aux.end(), a.begin()+l);
+  copy(begin(aux), end(aux), begin(a)+l);
 }
diff --git a/fontes/mex.h b/fontes/mex.h
index 081bf29..a9fc527 100644
--- a/fontes/mex.h
+++ b/fontes/mex.h
@@ -1,10 +1,12 @@
 struct mex {
   vector<bool> tomex; int gt = 0;
   mex(int n) : tomex(n) {};
-  void insert_mex(int x) { tomex[x] = 1; gt = max(gt, x); }
+  void insert_mex(int x) {
+    tomex[x] = 1; gt = max(gt, x);
+  }
   int get_reset_mex() {
     int m; for (m = 0; tomex[m]; m++);
-    fill(tomex.begin(), tomex.begin()+gt+1, 0);
+    fill(begin(tomex), begin(tomex)+gt+1, 0);
     return m;
   }
 };
diff --git a/fontes/miller-rabin.h b/fontes/miller-rabin.h
index e14a420..eb9711a 100644
--- a/fontes/miller-rabin.h
+++ b/fontes/miller-rabin.h
@@ -11,15 +11,15 @@ ll binary_pow(ll a, ll e, ll m) {
 vector<int> witnesses = {
   2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37 };
 bool is_prime(ll n) {
-  if (n < 2) { return false; }
+  if (n < 2) { return 0; }
   int s = __lg((n-1)&-(n-1));
   ll d = n >> s;
   for (int a : witnesses) {
-    if (n == a) { return true; }
+    if (n == a) { return 1; }
     ll p = binary_pow(a, d, n), i = s;
     while (p != 1 && p != n - 1 && a % n && i--)
       p = (i128)p * p % n;
-    if (p != n - 1 && i != s) { return false; }
+    if (p != n - 1 && i != s) { return 0; }
   }
-  return true;
+  return 1;
 }
diff --git a/fontes/mo-algorithm.h b/fontes/mo-algorithm.h
index 6bae8ad..b49ee49 100644
--- a/fontes/mo-algorithm.h
+++ b/fontes/mo-algorithm.h
@@ -1,6 +1,6 @@
 vector<int> mo(vector<qry> qs) {
   vector<int> ans (qs.size());
-  sort(qs.begin(), qs.end(), [](qry a, qry b) {
+  sort(begin(qs), end(qs), [](qry a, qry b) {
     if (a.l/B != b.l/B) { return a.l < b.l; }
     return ((a.l/B) % 2 == 0) ^ (a.r < b.r);
   });
diff --git a/fontes/monotone.h b/fontes/monotone.h
index 3e9769b..e73b3f0 100644
--- a/fontes/monotone.h
+++ b/fontes/monotone.h
@@ -1,6 +1,6 @@
-vector<pt> convex_hull(vector<pt>& ps, bool col = false) {
+vector<pt> convex_hull(vector<pt>& ps, bool col = 0) {
   int k = 0, n = ps.size(); vector<pt> ans (2*n);
-  sort(ps.begin(), ps.end(), [](pt a, pt b) {
+  sort(begin(ps), end(ps), [](pt a, pt b) {
     return make_pair(a.px, a.py) < make_pair(b.px, b.py);
   });
   for (int i = 0; i < n; i++) {
diff --git a/fontes/next-combination.h b/fontes/next-combination.h
index fde88a7..1665b46 100644
--- a/fontes/next-combination.h
+++ b/fontes/next-combination.h
@@ -1,9 +1,9 @@
 bool next_combination(vector<int>& a, int n) {
   int k = a.size();
-  for (int i = k - 1; i >= 0; i--) if (a[i] < n - k + i + 1) {
+  for (int i = k-1; i >= 0; i--) if (a[i] <= n-k+i) {
     a[i]++;
     for (int j = i + 1; j < k; j++)
-      a[j] = a[j - 1] + 1;
+      a[j] = a[j-1] + 1;
     return 1;
   }
   return 0;
diff --git a/fontes/numbers.h b/fontes/numbers.h
index f9cd80a..f29ff4c 100644
--- a/fontes/numbers.h
+++ b/fontes/numbers.h
@@ -1,4 +1,5 @@
-ll clamp(ll x, ll lo, ll hi) { return min(hi, max(x, lo)); }
+ll clamp(ll x, ll lo, ll hi) {
+  return min(hi, max(x, lo)); }
 int msb(ll i) { return i ? __lg(i)+1 : 0; }
 int lsb(ll i) { return msb(i&-i); }
 ll equals_zero_mod_m_inclusive(ll a, ll b, ll m) {
@@ -8,6 +9,6 @@ ll multiples_inclusive(ll a, ll b, ll x) {
 ll ceil_div(ll x, ll y) { return (x/y) + bool(x%y); }
 ll round_div(ll x, ll y) { return (x+y/2)/y; }
 ll mulll(ll a, ll b, ll m) { // a * b % m
-  ll ret = a * b - ll((long double) 1/m * a * b + 0.5) * m;
+  ll ret = a*b - ll((long double)1/m*a*b + 0.5) * m;
   return ret < 0 ? ret + m : ret;
 }
diff --git a/fontes/optimal-schedule-jobs.h b/fontes/optimal-schedule-jobs.h
index 23a7d3e..b8165b1 100644
--- a/fontes/optimal-schedule-jobs.h
+++ b/fontes/optimal-schedule-jobs.h
@@ -4,13 +4,13 @@ struct job {
 };
 
 vector<int> compute_schedule(vector<job> jobs) {
-  sort(jobs.begin(), jobs.end());
+  sort(begin(jobs), end(jobs));
   set<pair<int,int>> s; vector<int> schedule;
   for (int i = jobs.size()-1; i >= 0; i--) {
     int t = jobs[i].dl - (i ? jobs[i-1].dl : 0);
     s.insert(make_pair(jobs[i].duration, jobs[i].idx));
     while (t && !s.empty()) {
-      auto it = s.begin();
+      auto it = begin(s);
       if (it->first <= t) {
         t -= it->first;
         schedule.push_back(it->second);
diff --git a/fontes/parquet.h b/fontes/parquet.h
index 22494cf..6c74613 100644
--- a/fontes/parquet.h
+++ b/fontes/parquet.h
@@ -1,6 +1,6 @@
 vector<vector<ll>> dp (N+1, vector<ll>(1LL<<M));
 
-void calc(int x = 0, int y = 0, int s = 0, int nxts = 0) {
+void calc(int x=0, int y=0, int s=0, int nxts=0) {
   if (x == n) { return; }
   if (y >= m) { dp[x+1][nxts] += dp[x][s]; return; }
   int cs = 1 << y;
diff --git a/fontes/point-in-polygon.h b/fontes/point-in-polygon.h
index 2d34a1b..6848188 100644
--- a/fontes/point-in-polygon.h
+++ b/fontes/point-in-polygon.h
@@ -1,6 +1,6 @@
 int is_inside_poly(vector<pt>& ps, pt p, int strict) {
   int n = ps.size();
-  if (n < 3) { return false; }
+  if (n < 3) { return 0; }
   int count = 0;
   for (int i = 0; i < n; i++) {
     int j = (i+1)%n;
diff --git a/fontes/polygon-lattice-points.h b/fontes/polygon-lattice-points.h
index 14bc9a0..efc2cd3 100644
--- a/fontes/polygon-lattice-points.h
+++ b/fontes/polygon-lattice-points.h
@@ -2,12 +2,9 @@ ll lattice_points(vector<pt>& ps) {
   ll b = 0;
   for (int i = 0; i < n; i++) {
     pt v = vec(ps[i], ps[(i+1)%n]);
-    if (v.py == 0)
-      b += abs(v.px);
-    else if (v.px == 0)
-      b += abs(v.py);
-    else
-      b += gcd(abs(v.px), abs(v.py));
+    if (v.py == 0) { b += abs(v.px); }
+    else if (v.px == 0) { b += abs(v.py); }
+    else { b += gcd(abs(v.px), abs(v.py)); }
   }
   return poly_area(ps) - b/2 + 1;
 }
diff --git a/fontes/prim.h b/fontes/prim.h
index 7c8431a..806f81e 100644
--- a/fontes/prim.h
+++ b/fontes/prim.h
@@ -10,7 +10,7 @@ ll prim(int src) {
   while (!Q.empty()) {
     auto [c, u] = Q.top(); Q.pop();
     if (vis[u]) { continue; }
-    vis[u] = true;
+    vis[u] = 1;
     if (par[u] != -1) {
       int v = par[u]; ll w = d[u];
       pt[u].push_back(ii(v, w));
diff --git a/fontes/remove-deque.h b/fontes/remove-deque.h
index 68394aa..f9a4b4c 100644
--- a/fontes/remove-deque.h
+++ b/fontes/remove-deque.h
@@ -5,7 +5,7 @@ vector<int> remove(vector<int>& v, vector<int>& r) {
   for (int i = 0; i < n; i++)
     l[i/B].push_back(v[i]);
   for (int i : r) {
-    auto it = l[i/B].begin()+(i%B);
+    auto it = begin(l[i/B])+(i%B);
     ans.push_back(*it); l[i/B].erase(it);
     int bi = i/B;
     while (l[bi+1].size() > 0) {
diff --git a/fontes/segment.h b/fontes/segment.h
index 76171c0..10bffdb 100644
--- a/fontes/segment.h
+++ b/fontes/segment.h
@@ -3,5 +3,5 @@
 using seg = pair<pt, pt>;
 pt vec(seg s) { return vec(s.aa, s.bb); }
 int ord_ornt(seg s, pt c) {
-    return seg_ornt(s.aa, s.bb, c);
+  return seg_ornt(s.aa, s.bb, c);
 }
diff --git a/fontes/sieve.h b/fontes/sieve.h
index 470673b..31440de 100644
--- a/fontes/sieve.h
+++ b/fontes/sieve.h
@@ -1,6 +1,6 @@
-vector<bool> sieve (1e7+15, true);
+vector<bool> sieve (1e7+15, 1);
 void eratosthenes(int n) {
   for (int i = 2; i * i <= n; i++) if (sieve[i])
     for (int j = i * i; j <= n; j += i)
-      sieve[j] = false;
+      sieve[j] = 0;
 }
diff --git a/fontes/sparse-table.h b/fontes/sparse-table.h
index cf932ba..c54a2a8 100644
--- a/fontes/sparse-table.h
+++ b/fontes/sparse-table.h
@@ -10,10 +10,10 @@ void build(vector<int>& src) {
 
   for (int j = 1; j <= K; j++)
   for (int i = 0; i + (1 << j) <= N; i++)
-    st[i][j] = min(st[i][j-1], st[i + (1 << (j - 1))][j - 1]);
+    st[i][j] = min(st[i][j-1], st[i+(1 << (j-1))][j-1]);
 }
 
 int min_inclusive(int l, int r) {
-  int j = lg[r - l + 1];
-  return min(st[l][j], st[r - (1 << j) + 1][j]);
+  int j = lg[r-l+1];
+  return min(st[l][j], st[r-(1 << j)+1][j]);
 }
diff --git a/fontes/spfa.h b/fontes/spfa.h
index 6baf3c7..de88162 100644
--- a/fontes/spfa.h
+++ b/fontes/spfa.h
@@ -1,27 +1,20 @@
-vector<ll> d (N); vector<bool> queu (N);
-vector<int> cnt (N);
-
 bool spfa(int src, int n) {
-  fill(d.begin(), d.end(), oo);
-  fill(cnt.begin(), cnt.end(), 0);
+  vector<int> cnt (n);
+  vector<bool> queu (n);
+  vector<ll> d (n, oo);
   d[src] = 0;
   queue<int> q; q.push(src);
   while (!q.empty()) {
     int u = q.front(); q.pop();
     queu[u] = 0;
-    for (auto [v, w] : g[u]) {
-      if (d[v] > d[u] + w) {
-        d[v] = d[u] + w;
-        if (!queu[v]) {
-          q.push(v);
-          queu[v] = 1;
-          cnt[v]++;
-          if (cnt[v] > n)
-            // negative cycle
-            return false;
-        }
+    for (auto [v, w] : g[u]) if (d[v] > d[u] + w) {
+      d[v] = d[u] + w;
+      if (!queu[v]) {
+        q.push(v); queu[v] = 1; cnt[v]++;
+        // negative cycle
+        if (cnt[v] > n) { return 0; }
       }
     }
   }
-  return true;
+  return 1;
 }
diff --git a/fontes/stable-matching.h b/fontes/stable-matching.h
index eb2b592..e7817b4 100644
--- a/fontes/stable-matching.h
+++ b/fontes/stable-matching.h
@@ -1,24 +1,22 @@
-vector<vector<int>> pm (N, vector<int>(N)); // [m][j] = w
-vector<vector<int>> pwix (N, vector<int>(N+1)); // [w][m] = j
+vector<vi> pm (N, vi(N)); // [m][j] = w
+vector<vi> pwix (N, vi(N+1)); // [w][m] = j
 
-vector<bool> single (N, true);
+vector<bool> single (N, 1);
 vector<int> match (N, -1), watch (N, N);
 
 vector<ii> galeshapley(int n) {
   // sentinel
   for (int w = 0; w < n; w++) { pwix[w][n] = n; }
 
-  bool done = false;
+  bool done = 0;
   while (!done) {
-    done = true;
+    done = 1;
     for (int m = 0; m < n; m++) if (single[m]) {
-      done = false;
-      match[m] += 1;
+      done = 0; match[m] += 1;
       int w = pm[m][match[m]];
       if (pwix[w][m] < pwix[w][watch[w]]) {
-        single[watch[w]] = true;
-        watch[w] = m;
-        single[m] = false;
+        single[watch[w]] = 1;
+        watch[w] = m; single[m] = 0;
       }
     }
   }
diff --git a/fontes/stoer-wagner.h b/fontes/stoer-wagner.h
index 28eac66..f03b4fe 100644
--- a/fontes/stoer-wagner.h
+++ b/fontes/stoer-wagner.h
@@ -1,26 +1,23 @@
 vector<vector<int>> res (N, vector<int>(N));
-vector<int> dist (N);
-vector<bool> visited (N);
 vector<bool> bin (N);
 
 int contract(int n, int &s, int &t) {
-  fill(dist.begin(), dist.end(), 0);
-  fill(visited.begin(), visited.end(), 0);
+  vector<int> dist (n);
+  vector<bool> vis (n);
 
   int mincut, maxc;
   for (int i = 0; i < n; i++) {
     int k = -1; maxc = -1;
     for (int j = 0; j < n; j++)
-      if (!bin[j] && !visited[j] && dist[j] > maxc) {
+      if (!bin[j] && !vis[j] && dist[j] > maxc) {
         k = j;
         maxc = dist[j];
       }
     if (k == -1) return mincut;
-    s = t;  t = k;
-    mincut = maxc;
-    visited[k] = true;
+    s = t; t = k;
+    mincut = maxc; vis[k] = 1;
     for (int j = 1; j < n; j++)
-      if (!bin[j] && !visited[j]) {
+      if (!bin[j] && !vis[j]) {
         dist[j] += res[k][j];
       }
   }
@@ -33,7 +30,7 @@ int stoer_wagner(int n) {
   for (int i = 0; i < n-1; i++) {
     mincut = min(mincut, contract(n, s, t));
     if (mincut == 0) { return 0; }
-    bin[t] = true;
+    bin[t] = 1;
     for (int j = 0; j < n; j++) if (!bin[j]) {
       res[s][j] = (res[j][s] += res[j][t]);
     }
diff --git a/fontes/suffix-array-radix.h b/fontes/suffix-array-radix.h
index cb475a6..89bc425 100644
--- a/fontes/suffix-array-radix.h
+++ b/fontes/suffix-array-radix.h
@@ -2,7 +2,7 @@ pair<vector<int>, vector<int>> build_sa(string s, int n) {
   vector<int> sk (n), sa (n);
   vector<pair<int, int>> a (n);
   for (int i = 0; i < n; i++) { a[i] = { s[i], i }; }
-  sort(a.begin(), a.end());
+  sort(begin(a), end(a));
   for (int i = 0; i < n; i++) { tie(sk[i], sa[i]) = a[i]; }
   vector<int> nsk(n);
   for (int i = 1, r = 0; i < n; i++)
@@ -19,7 +19,7 @@ pair<vector<int>, vector<int>> build_sa(string s, int n) {
     for (int i = 1, r = 0; i < n; i++)
       nsk[sa[i]] =
         make_pair(sk[sa[i-1]], sk[(sa[i-1]+k)%n]) ==
-        make_pair(sk[sa[i-0]], sk[(sa[i-0]+k)%n]) ? r : ++r;
+        make_pair(sk[sa[i]], sk[(sa[i]+k)%n]) ? r : ++r;
     sk.swap(nsk);
   }
   return make_pair(sa, sk);
diff --git a/fontes/suffix-array.h b/fontes/suffix-array.h
index 3c210b3..e66e853 100644
--- a/fontes/suffix-array.h
+++ b/fontes/suffix-array.h
@@ -3,12 +3,12 @@
 
 pair<vector<int>, vector<int>> build_sa(string s) {
   int n = s.size();
-  vector<int> sk (s.begin(), s.end());
+  vector<int> sk (begin(s), end(s));
   vector<pair<pair<int, int>, int>> a(n);
   for (int k = 1; k < n; k *= 2) {
     for (int i = 0; i < n; i++)
       a[i] = { { sk[i], sk[(i+k)%n] }, i };
-    sort(a.begin(), a.end());
+    sort(begin(a), end(a));
     sk[a[0].ii] = 0;
     for (int i = 1, r = 0; i < n; i++)
       sk[a[i].ii] = a[i-1].kk == a[i].kk ? r : ++r;
diff --git a/fontes/suffix-automaton.h b/fontes/suffix-automaton.h
index 1802f4a..ec7e60b 100644
--- a/fontes/suffix-automaton.h
+++ b/fontes/suffix-automaton.h
@@ -10,7 +10,7 @@ void add(int c) {
   int q = nxt[p][c];
   if (len[q] == len[p]+1) { lnk[cur] = q; return; }
   int qq = sz++; len[qq] = len[p]+1; lnk[qq] = lnk[q];
-  copy(nxt[q].begin(), nxt[q].end(), nxt[qq].begin());
+  copy(begin(nxt[q]), end(nxt[q]), begin(nxt[qq]));
   for (; ~p && nxt[p][c] == q; p = lnk[p])
     nxt[p][c] = qq;
   lnk[cur] = lnk[q] = qq;
diff --git a/fontes/suffix-tree.h b/fontes/suffix-tree.h
index b59154b..cf5ae8a 100644
--- a/fontes/suffix-tree.h
+++ b/fontes/suffix-tree.h
@@ -1,45 +1,44 @@
-struct suffix_tree {
-  vector<vector<int>> nxt;
-  vector<int> l, r, parent, suf;
-  suffix_tree() : nxt(N, vector<int>(5)), l(N), r(N),
-    parent(N), suf(N) {}
-  int len(int i) { return r[i] - l[i] + 1; }
-  int at(string& s, int i, int j) { return id(s[l[i] + j]); }
-  int cur = 1;
-  int new_node(int a, int b, int p) {
-    l[cur] = a, r[cur] = b; parent[cur] = p; return cur++;
-  }
-  void build(string s) {
-    s += '$';
-    int root = new_node(0, -1, 0);
-    int u = root, i = 0, ui = 0, ns = 0;
-    for (int j = 0; j < s.size(); j++) for (; i <= j; i++) {
-      if (ui == len(u) && nxt[u][id(s[j])])
-        { u = nxt[u][id(s[j])]; ui = 0; }
-      if (ui < len(u) && at(s, u, ui) == id(s[j]))
-        { ui++; break; }
-      if (ui == len(u)) {
-        nxt[u][id(s[j])] = new_node(j, s.size()-1, u);
-        if (u != root) { u = suf[u]; ui = len(u); }
+vector<vector<int>> nxt (N, vector<int>(5));
+vector<int> l (N), r (N), parent (N), suf (N);
+int len(int i) { return r[i] - l[i] + 1; }
+int at(string& s, int i, int j) {
+  return id(s[l[i] + j]);
+}
+int cur = 1;
+int new_node(int a, int b, int p) {
+  l[cur] = a, r[cur] = b; parent[cur] = p;
+  return cur++;
+}
+void build(string s) {
+  s += '$';
+  int root = new_node(0, -1, 0);
+  int u = root, i = 0, ui = 0, ns = 0;
+  for (int j = 0; j < s.size(); j++) for (; i <= j; i++) {
+    if (ui == len(u) && nxt[u][id(s[j])])
+      { u = nxt[u][id(s[j])]; ui = 0; }
+    if (ui < len(u) && at(s, u, ui) == id(s[j]))
+      { ui++; break; }
+    if (ui == len(u)) {
+      nxt[u][id(s[j])] = new_node(j, s.size()-1, u);
+      if (u != root) { u = suf[u]; ui = len(u); }
+    } else {
+      int mi = new_node(l[u], l[u] + ui - 1, parent[u]);
+      nxt[parent[u]][at(s, mi, 0)] = mi;
+      nxt[mi][at(s, u, ui)] = u;
+      parent[u] = mi; l[u] += ui;
+      nxt[mi][id(s[j])] = new_node(j, s.size()-1, mi);
+      if (ns) { suf[ns] = mi; }
+      u = parent[mi]; int g;
+      if (u != root)
+        { u = suf[u]; g = j - ui; } else { g = i + 1; }
+      while (g < j && g + len(nxt[u][id(s[g])]) <= j) {
+        u = nxt[u][id(s[g])]; g += len(u);
+      }
+      if (g == j) {
+        ns = 0; suf[mi] = u; ui = len(u);
       } else {
-        int mi = new_node(l[u], l[u] + ui - 1, parent[u]);
-        nxt[parent[u]][at(s, mi, 0)] = mi;
-        nxt[mi][at(s, u, ui)] = u;
-        parent[u] = mi; l[u] += ui;
-        nxt[mi][id(s[j])] = new_node(j, s.size()-1, mi);
-        if (ns) { suf[ns] = mi; }
-        u = parent[mi]; int g;
-        if (u != root)
-          { u = suf[u]; g = j - ui; } else { g = i + 1; }
-        while (g < j && g + len(nxt[u][id(s[g])]) <= j) {
-          u = nxt[u][id(s[g])]; g += len(u);
-        }
-        if (g == j) {
-          ns = 0; suf[mi] = u; ui = len(u);
-        } else {
-          ns = mi; u = nxt[u][id(s[g])]; ui = j - g;
-        }
+        ns = mi; u = nxt[u][id(s[g])]; ui = j - g;
       }
     }
   }
-};
+}
diff --git a/fontes/topological-order.h b/fontes/topological-order.h
index 285df03..10886bd 100644
--- a/fontes/topological-order.h
+++ b/fontes/topological-order.h
@@ -8,7 +8,7 @@ void dfs_topo(int u) {
 }
 
 vector<int> toposort(int n) {
-  fill(visited.begin(), visited.begin() + n, false);
+  fill(begin(vis), begin(vis) + n, 0);
   vector<int> topo;
   for (int u = 0; u < n; u++) { dfs_topo(u); }
   while (!st.empty()) {
diff --git a/fontes/tree-square-root-decomposition.h b/fontes/tree-square-root-decomposition.h
index b5b848b..5a9f3b9 100644
--- a/fontes/tree-square-root-decomposition.h
+++ b/fontes/tree-square-root-decomposition.h
@@ -2,25 +2,25 @@ vector<int> up (N), bup (N), depth (N);
 vector<ll> weiop (N), bweiop (N);
 
 void stdt_decompose(int u, int p, int w) {
-    up[u] = p; weiop[u] = w;
-    depth[u] = depth[p] + 1;
-    bup[u] = depth[u] % B ? bup[p] : p;
-    bweiop[u] = OP(depth[u] % B ? bweiop[p] : NEUTRAL, w);
-    for (auto [v, w] : g[u]) if (v != p)
-        stdt_decompose(v, u, w);
+  up[u] = p; weiop[u] = w;
+  depth[u] = depth[p] + 1;
+  bup[u] = depth[u] % B ? bup[p] : p;
+  bweiop[u] = OP(depth[u] % B ? bweiop[p] : NEUTRAL, w);
+  for (auto [v, w] : g[u]) if (v != p)
+    stdt_decompose(v, u, w);
 }
 
 int stdt_op(int a, int b) {
-    int ans = NEUTRAL;
-    if (!(depth[a]/B > depth[b]/B)) { swap(a, b); }
-    while (depth[a]/B > depth[b]/B) {
-        ans = OP(ans, bweiop[a]); a = bup[a]; }
-    if (!(depth[a] > depth[b])) { swap(a, b); }
-    while (depth[a] > depth[b]) {
-        ans = OP(ans, weiop[a]); a = up[a]; }
-    while (a != b) {
-        ans = OP(ans, OP(weiop[a], weiop[b]));
-        a = up[a]; b = up[b];
-    }
-    return ans;
+  int ans = NEUTRAL;
+  if (!(depth[a]/B > depth[b]/B)) { swap(a, b); }
+  while (depth[a]/B > depth[b]/B) {
+    ans = OP(ans, bweiop[a]); a = bup[a]; }
+  if (!(depth[a] > depth[b])) { swap(a, b); }
+  while (depth[a] > depth[b]) {
+    ans = OP(ans, weiop[a]); a = up[a]; }
+  while (a != b) {
+    ans = OP(ans, OP(weiop[a], weiop[b]));
+    a = up[a]; b = up[b];
+  }
+  return ans;
 }
diff --git a/fontes/trie.h b/fontes/trie.h
index 5fd31f9..113b9d9 100644
--- a/fontes/trie.h
+++ b/fontes/trie.h
@@ -1,6 +1,6 @@
 struct trie {
   vector<int> nxt; int cnt; bool leaf;
-  trie() : nxt (S, -1), cnt (0), leaf (false) {}
+  trie() : nxt (S, -1), cnt (0), leaf (0) {}
 };
 vector<trie> t (1);
 void ins(string ne) {
@@ -14,5 +14,5 @@ void ins(string ne) {
     u = t[u].nxt[ch];
     t[u].cnt++;
   }
-  t[u].leaf = true;
+  t[u].leaf = 1;
 }
-- 
GitLab