diff --git a/caderno/caderno.tex b/caderno/caderno.tex
index 114f2b982a09bfab2da6b8b30ad7819fe0a46a1e..bf2cceef4d65c981cdee1a5c7886e99001b5d326 100644
--- a/caderno/caderno.tex
+++ b/caderno/caderno.tex
@@ -355,6 +355,12 @@ para $a$ e $m$ coprimos.
 \subsection{Menor anc. comum -- Ancensão binária}
 \importsource{bllca.h}
 
+\subsection{Menor no maior}
+\importsource{small-to-large.h}
+
+\subsection{Decomposição centróide}
+\importsource{centroid.h}
+
 \subsection{Decomposição pesado-leve}
 \begin{tabular}{l|l}
   \hline
@@ -716,4 +722,7 @@ A = i + b/2 - 1
 \subsection{Distância de Edição}
 \importsource{edit-distance.h}
 
+\subsection{Frequência de frequêncies}
+\importsource{freq-freq.h}
+
 \end{document}
diff --git a/fontes/centroid.h b/fontes/centroid.h
new file mode 100644
index 0000000000000000000000000000000000000000..13c0482914e1b81ce8070589c695116f739357e4
--- /dev/null
+++ b/fontes/centroid.h
@@ -0,0 +1,22 @@
+vector<int> rep (N), parc (N), vis (N), sz (N);
+
+int calc_size(int u, int p) {
+  sz[u] = 1;
+  for (int v : g[u]) if (v != p && !vis[v])
+    sz[u] += calc_size(v, u);
+  return sz[u];
+}
+
+int find_centroid(int u, int p, int n) {
+  for (int v : g[u]) if (v != p && !vis[v] && sz[v] > n/2)
+    return find_centroid(v, u, n);
+  return u;
+}
+
+void centroid_decompose(int u, int p, int d = 0) {
+  calc_size(u, u);
+  int c = find_centroid(u, u, sz[u]);
+  vis[c] = 1; parc[c] = p;
+  for (int v : g[c]) if (!vis[v])
+    centroid_decompose(v, c, d+1);
+}
diff --git a/fontes/freq-freq.h b/fontes/freq-freq.h
new file mode 100644
index 0000000000000000000000000000000000000000..e21ddf0af515c4b4d06bd3ecc60ec0b5ef594b61
--- /dev/null
+++ b/fontes/freq-freq.h
@@ -0,0 +1,11 @@
+vector<int> hvy (N), cnt (C), freqfreq (N);
+vector<ll> c (N), sumfreq (N);
+int mf = 0;
+
+freqfreq[cnt[c[u]]]--;
+if (cnt[c[u]]) { sumfreq[cnt[c[u]]] -= c[u]; }
+cnt[c[u]] += x;
+if (cnt[c[u]]) { sumfreq[cnt[c[u]]] += c[u]; }
+freqfreq[cnt[c[u]]]++;
+if (freqfreq[mf+1]) { mf++; }
+if (mf > 0 && freqfreq[mf] == 0) { mf--; }
diff --git a/fontes/small-to-large.cpp b/fontes/small-to-large.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e098a046ca50bf15d7bfd7aecc212fabe4bf360a
--- /dev/null
+++ b/fontes/small-to-large.cpp
@@ -0,0 +1,28 @@
+vector<int> hvy (N);
+vector<int> sz (N, 1);
+
+int calc_size(int u, int p) {
+  for (int v : g[u]) if (v != p)
+    sz[u] += calc_size(v, u);
+  return sz[u];
+}
+
+void dfs_add(int u, int p, int x) {
+  // add
+  for (int v : g[u]) if (v != p && !hvy[v])
+    dfs_add(v, u, x);
+}
+
+void small_large(int u, int p, bool keep) {
+  int mx = -1, h = -1;
+  for (int v : g[u]) if (v != p && sz[v] > mx) {
+    mx = sz[v]; h = v;
+  }
+  for (int v : g[u]) if (v != p && v != h)
+    small_large(v, u, 0);
+  if (h != -1) { small_large(h, u, 1); hvy[h] = 1; }
+  dfs_add(u, p, +1);
+  // solve queries
+  if (h != -1) { hvy[h] = 0; }
+  if (keep == 0) { dfs_add(u, p, -1); }
+}