Hi👋SpeedAlgo • Deliberate Practice & Cognitive Ergonomics for Software Engineers

An interactive algorithm mastery and technical interview preparation platform published by Hi👋WebEnterprise. Built for senior and staff software engineers preparing for rigorous coding screens at top tech companies (FAANG/MAMAA).

13 Core Algorithmic Patterns & 225 Practice Problems

  • 1. Two Pointers (16 Paradigms, 43 Problems): Opposite ends, sorted pair sums, palindrome verification, trapping rain water, 3Sum, container with most water — includes the Sliding Window and Fast & Slow Pointers paradigms (contiguous subarray invariants, longest substrings, Floyd's cycle detection, linked list middle).
  • 2. Binary Search (9 Paradigms, 14 Problems): Monotonic predicate partitioning (feasible(x)), boundary search, rotated sorted arrays, square roots, minimum ship capacity, median of two sorted arrays, matrix median on value range.
  • 3. Bit Manipulation (5 Paradigms, 11 Problems): Counting set bits, XOR cancellation, bit reversal, bitmask pairing, maximum XOR with a bitwise trie.
  • 4. Math & Geometry (8 Paradigms, 14 Problems): Sieve of Eratosthenes, integer/roman conversions, modular arithmetic, geometric simulation.
  • 5. Tree/Graph Depth-First Search (15 Paradigms, 24 Problems): Path sums, lowest common ancestor, tree diameter, validating BSTs, tree DP (House Robber III, Binary Tree Cameras).
  • 6. Tree/Graph Breadth-First Search (5 Paradigms, 12 Problems): Level-order traversals, shortest path in unweighted graphs, zig-zag traversals, rotting oranges, word ladders.
  • 7. Graphs (12 Paradigms, 22 Problems): Topological sort, cycle detection, Dijkstra's algorithm, bipartite graph validation, network delay.
  • 8. Backtracking (6 Paradigms, 14 Problems): Subsets, permutations, combinations, constraint satisfaction, pruning, N-Queens, Sudoku solver.
  • 9. Dynamic Programming (13 Paradigms, 28 Problems): Memoization vs tabulation, 0/1 knapsack, unbounded knapsack, coin change, edit distance, longest common subsequence.
  • 10. Heap / Priority Queue (9 Paradigms, 11 Problems): Running medians, top-k elements, interval scheduling, IPO, k-way merges.
  • 11. Advanced Data Structures (7 Paradigms, 17 Problems): Trie (prefix tree), Union-Find (Disjoint Set Union), LRU Cache, LFU Cache, range-sum queries with updates.
  • 12. Stack (5 Paradigms, 9 Problems): Next greater element, largest rectangle in histogram, remove k digits, decode string, min stack.
  • 13. Intervals & Greedy (2 Paradigms, 6 Problems): Merge intervals, interval scheduling, meeting rooms by sweep line, jump game.

4-Stage Deliberate Practice Framework

  1. Stage 1 (Compare & Learn): Read the pattern's mental model, loop invariant and Big-O proof, compare the pattern's template with the problem's solution side by side, and use the step-by-step debugger. The solution can also be shown in C#, Java, TypeScript, C++, Go or Rust for almost every problem.
  2. Stage 2 (Active Recall): Rebuild the solution from memory in a code editor, with an invariant checklist and optional progressive hints, and check it against a judged test suite.
  3. Stage 3 (AI Interview Coach, coming soon): A mock-interview stage still in development; for now, students go straight from Stage 2 to Stage 4.
  4. Stage 4 (Solve on Your Own): Solve a new problem on your own against a 15-minute timer; your code is graded against a test suite. Python and TypeScript run in your browser and C# runs on our server (design problems grade in Python and TypeScript).

Equipped with a spaced-repetition review hub on a fixed 7-step schedule (1 day up to 90 days), a two-pane Studio workspace, and study notes.

Pricing, Access & Commercial Terms

  • Core Curriculum: 100% Free. No credit card required.
  • Coins: New accounts get 40 free coins once, the daily claim adds +20 coins once a day, and inviting a friend earns you +25 coins when they complete their first practice step. These are the only ways to earn coins.
  • AI Coach: Each AI coach question costs 1-5 coins, priced by the server according to its size.
  • BYOK (Bring Your Own Key): AI coaching is free with your own Google Gemini, OpenAI or OpenRouter API key (BYOK).
  • Extras: Coins also unlock extras for 24 hours: a Recall hint level (1 coin), a Solve solution reveal (2), a LeetCode problem card's solutions (1) and a pattern's extra canonical problems (1).
  • Payments & Refunds: Nothing on the site is sold for money: coins can only be earned, never bought. There are no subscriptions or charges, so there is nothing to refund.
  • Platform Operator: Hi👋WebEnterprise. Support & policies at hispeedalgo.com.
Skip to main content
Hi👋SpeedAlgo

Invariant-First Algorithmic Mastery

Arena
238Items
Theory Context•Advanced Data Structures
MediumLC 307

Range Sum Query - Mutable (LeetCode 307)

Target Frequency:GoogleAmazonMeta

You get an integer array nums, followed by a mix of two kinds of requests in any order: change one element, or report the sum of a contiguous stretch of elements.

Build the NumArray class:

  • NumArray(nums) stores the array.
  • update(index, val) sets nums[index] to val.
  • sumRange(left, right) returns nums[left] + nums[left + 1] + ... + nums[right], both ends included (left <= right).

Worked Examples

Example 1
Input:["NumArray", "sumRange", "update", "sumRange"] [[[1, 3, 5]], [0, 2], [1, 2], [0, 2]]
Output:[null, 9, null, 8]
103152update(1, 2)
Explanation: The array starts as [1, 3, 5], so sumRange(0, 2) is 1 + 3 + 5 = 9. update(1, 2) makes it [1, 2, 5], and the next sumRange(0, 2) is 1 + 2 + 5 = 8.

⚖️Formal Constraints & Bounds

  • 1 <= nums.length <= 3 * 104

  • -100 <= nums[i] <= 100

  • 0 <= index < nums.length

  • -100 <= val <= 100

  • 0 <= left <= right < nums.length

  • At most 3 * 104 calls will be made to update and sumRange.

Deep-Dive & Conceptual Insights

Core Insight

Store in each node the sum of the range it covers, built from its two half-range children: a range sum reads a few whole nodes, and a changed slot sits under only one node per level, so both operations visit O(log N) nodes.

Real-World Scenario & Production Applications

A sales dashboard keeps one number per team and shows the total for any group of neighbouring teams. A team sometimes corrects its number, and the totals must stay right at once. A tree of subtotals does this: a correction repairs the subtotals above that team, and a group total reads a few subtotals instead of adding every team.

Step-by-Step Execution Trace Table

nums = [1, 3, 5] (n = 3). The root is node 0 and covers slots 0..2. Node 1 covers 0..1, node 2 covers 2..2, node 3 covers 0..0 and node 4 covers 1..1.

CallNodes visitedtree[0..4] afterReturns
buildleaves 3, 4 and 2 are filled; node 1 = 1 + 3, node 0 = 4 + 5[9, 4, 5, 1, 3]
sumRange(0, 2)node 0 covers 0..2, fully inside the query, so it returns tree[0][9, 4, 5, 1, 3]9
update(1, 2)0 → 1 → 4: leaf 4 is set to 2, then node 1 = 1 + 2 = 3, then node 0 = 3 + 5 = 8[8, 3, 5, 1, 2]null
sumRange(0, 2)node 0 is fully inside the query, so it returns tree[0][8, 3, 5, 1, 2]8
Code Shape
Archetype Code Shape
Python
1`tree[node]` holds the sum of the slots `left..right` that `node` covers, and its children `2 * node + 1` and `2 * node + 2` hold the two halves, so any range is a few whole nodes and any slot sits under one node per level.
2`update` walks to the leaf for `index`, sets it, then recomputes `self.tree[node]` from both children on the way back up; `query` returns the stored sum inside `[ql, qr]`, `0` outside, and the sum of both halves otherwise.
3`NumArray`: build `SegmentTree(nums)`, `update(index, val)` calls the tree's `update`, `sumRange(left, right)` returns `self.seg.query(left, right)`.
4The trap: after the recursive `update` returns, recompute `self.tree[node] = self.tree[2 * node + 1] + self.tree[2 * node + 2]`, or every sum above the leaf stays stale.

Conceptual Narrative

🧭 Conceptual Foundation & Pattern Intuition

A plain array changes one element in O(1)O(1)O(1) but sums a range in O(N)O(N)O(N). A prefix-sum array sums any range in O(1)O(1)O(1) but needs an O(N)O(N)O(N) rebuild after every change. A segment tree stores the sum of many ranges in a binary tree. Node node covers the slots left..right, and its two children cover the two halves. A range sum then reads a few stored nodes, and a change repairs one path from a leaf to the root. Both take O(log⁡N)O(\log N)O(logN).

🏟️ The Analogy: Team Totals in a Company

A company reports sales by team. Each manager keeps the total of the two groups directly below, and the head of the company keeps the grand total. To total the sales of a stretch of neighbouring teams, you read the totals of a few managers whose groups lie completely inside that stretch. When one team corrects its number, only the managers above that team, up to the head, recompute their totals.

🔑 Why It Works

After every update, self.tree[node] equals the sum of the slots left..right that node covers: update sets the leaf, then recomputes each ancestor from its two children on the way back up. query returns a stored sum only for a node fully inside [ql, qr], returns 0 for a node fully outside, and adds both children otherwise. At most two nodes per level overlap only part of the range, so every call visits O(log⁡N)O(\log N)O(logN) nodes.

  • Not recomputing ancestors: changing only the leaf in update leaves every sum above it stale; on LeetCode Example 1 (nums = [1,3,5], then update(1, 2)) the second sumRange(0, 2) returns 9 instead of 8. Recompute self.tree[node] after the recursive call returns.

  • An overlap test instead of a containment test: query may return self.tree[node] only when ql <= left and right <= qr; a node that merely overlaps the range also holds slots outside it, and sumRange(0, 1) on [1,3,5] would return 9 instead of 4.

  • Adding val to the leaf: update(index, val) replaces the value, so the leaf is set to val. With +=, the second sumRange(0, 2) in Example 1 returns 11 instead of 8.

  • Too little space: 2 * n slots overflow when n is not a power of two; allocate 4 * n.

  • Rebuilding the whole tree on every update: correct, but each call then costs O(N); with 3 * 104 calls on 3 * 104 elements that is about 10^9 steps.

Senior SWE Reasoning Architecture

4-Phase Thought Process Model

Pattern Recognition Signals

The 10-second spot

"Change one element" mixed with "sum of a contiguous stretch", many times and in any order: a prefix array rebuilds in O(N) per change, and a plain array sums in O(N). Point updates plus range sums fit a Fenwick tree or a segment tree. The segment tree is the one to know when a node must store more than a prefix difference can give, such as a maximum.

Formulating the Predicate & Invariants

Turning intuition into a boolean rule

self.tree[node] always equals the sum of the slots left..right that node covers; update keeps it true by recomputing each ancestor from its two children, and query returns a stored sum only when ql <= left and right <= qr.

Silent Failure Traps & Edge Cases

Where confident candidates still lose points

This problem's traps are in Common Pitfalls above.

The 60-Second Interview Pitch

Say this out loud before you type a single line

I'd use a Segment Tree, because I need point updates and range sums mixed together. Each node stores the sum of the slots it covers, and its two children cover the two halves. A range sum returns a stored sum for a node fully inside the range, zero for a node fully outside, and adds both children for a node that overlaps only part of the range. At most two nodes per level overlap only part of the range, so a query is O(log N). An update walks to the one leaf for the index and sets it. On the way back up it recomputes every ancestor from its two children, and that line is the trap: without it, later queries read old sums. I allocate four times N nodes, because two times N can overflow when N is not a power of two. Building costs O(N) and space is O(N). If the problem only adds to one position and sums a prefix, I would use a Fenwick tree instead, because it is shorter.

Big-O Invariant Derivation

Complexity & Mathematical Proof

TIME COMPLEXITY

O(N) build, O(log N) update & query

Look at update: it follows one path from the root to a leaf, and each call halves the range, so the depth is about log2(N) + 1. It does O(1) work per node on the way back up: O(log N). Look at query: a node fully inside or fully outside the range returns at once. At most two nodes per level overlap only part of the range, so the calls per level stay at most four and the total is O(log N). _build visits each of the about 2N nodes once and does O(1) work per node: O(N). NumArray.update is one tree update and sumRange is one tree query.

SPACE COMPLEXITY

O(N)

self.tree has 4 * N slots: O(N). The recursion is at most about log2(N) + 1 calls deep, which is O(log N) of call stack.

Formal Recurrence Relation

T(update) = T(query) = O(log N); build = O(N)

Derivation Progression

Build

about 2N nodes × O(1) = O(N)

_build fills each leaf once and combines each inner node once.

Point update

depth × O(1) = O(log N)

One path down to the leaf, one recompute per ancestor on the way up.

Range sum

at most 4 calls per level × O(log N) levels = O(log N)

Only nodes that overlap part of the range split; at most two per level do.

Variable Definitions

NNN

Length of nums

nodenodenode

A tree slot; its children are 2 * node + 1 and 2 * node + 2

left..rightleft..rightleft..right

The slots of nums that node covers

Memory Architecture & Bounds

🟣 Call Stack

O(log N): the recursion is one call per level

🔵 Auxiliary Heap

O(N): tree has 4N slots

🟢 Output Space

O(1) per call

Boundary Best / Worst Cases

Best Case

O(1)O(1)O(1) for a query whose range is exactly the whole array: the root is fully inside

Average Case

O(log⁡N)O(\log N)O(logN) per operation; O(N)O(N)O(N) to build

Worst Case

O(log⁡N)O(\log N)O(logN) per operation

Recurrence Tree Topology

Recurrence Tree Topology
Synthesizing vector architecture diagram...
Staff+ Engineering Perspective

Senior SWE Deconstruction & Hardware Caveats

ARCHITECTURAL SIGNALS & INTERVIEW TRIGGERS

Triggers: "change one element", "sum of a contiguous stretch", "in any order". Point updates mixed with range sums: a Segment Tree whose node stores the sum of its range (a range sum reads a few whole nodes, an update repairs one path).

CONSTRAINTS & BOUNDS

N≤3×104N \le 3 \times 10^4N≤3×104 values in [−100,100][-100, 100][−100,100] and at most 3×1043 \times 10^43×104 calls. Sums stay within ±3×106\pm 3 \times 10^6±3×106. Naive: up to 9×1089 \times 10^89×108 steps; segment tree: about 3×104⋅163 \times 10^4 \cdot 163×104⋅16 node visits, since the tree is about 16 levels deep.

FAANG PRODUCTION TRAPS & EDGE CASES

In a concurrent service, an update rewrites one node per level from the leaf to the root. A reader that runs between two of those writes adds a new leaf to an old ancestor, so guard the walk with a lock, or build the changed path as new nodes and swap the root in one step.

Theory Context•Advanced Data Structures
MediumLC 307

Range Sum Query - Mutable (LeetCode 307)

Target Frequency:GoogleAmazonMeta

You get an integer array nums, followed by a mix of two kinds of requests in any order: change one element, or report the sum of a contiguous stretch of elements.

Build the NumArray class:

  • NumArray(nums) stores the array.
  • update(index, val) sets nums[index] to val.
  • sumRange(left, right) returns nums[left] + nums[left + 1] + ... + nums[right], both ends included (left <= right).

Worked Examples

Example 1
Input:["NumArray", "sumRange", "update", "sumRange"] [[[1, 3, 5]], [0, 2], [1, 2], [0, 2]]
Output:[null, 9, null, 8]
103152update(1, 2)
Explanation: The array starts as [1, 3, 5], so sumRange(0, 2) is 1 + 3 + 5 = 9. update(1, 2) makes it [1, 2, 5], and the next sumRange(0, 2) is 1 + 2 + 5 = 8.

⚖️Formal Constraints & Bounds

  • 1 <= nums.length <= 3 * 104

  • -100 <= nums[i] <= 100

  • 0 <= index < nums.length

  • -100 <= val <= 100

  • 0 <= left <= right < nums.length

  • At most 3 * 104 calls will be made to update and sumRange.

Deep-Dive & Conceptual Insights

Core Insight

Store in each node the sum of the range it covers, built from its two half-range children: a range sum reads a few whole nodes, and a changed slot sits under only one node per level, so both operations visit O(log N) nodes.

Real-World Scenario & Production Applications

A sales dashboard keeps one number per team and shows the total for any group of neighbouring teams. A team sometimes corrects its number, and the totals must stay right at once. A tree of subtotals does this: a correction repairs the subtotals above that team, and a group total reads a few subtotals instead of adding every team.

Step-by-Step Execution Trace Table

nums = [1, 3, 5] (n = 3). The root is node 0 and covers slots 0..2. Node 1 covers 0..1, node 2 covers 2..2, node 3 covers 0..0 and node 4 covers 1..1.

CallNodes visitedtree[0..4] afterReturns
buildleaves 3, 4 and 2 are filled; node 1 = 1 + 3, node 0 = 4 + 5[9, 4, 5, 1, 3]
sumRange(0, 2)node 0 covers 0..2, fully inside the query, so it returns tree[0][9, 4, 5, 1, 3]9
update(1, 2)0 → 1 → 4: leaf 4 is set to 2, then node 1 = 1 + 2 = 3, then node 0 = 3 + 5 = 8[8, 3, 5, 1, 2]null
sumRange(0, 2)node 0 is fully inside the query, so it returns tree[0][8, 3, 5, 1, 2]8
Code Shape
Archetype Code Shape
Python
1`tree[node]` holds the sum of the slots `left..right` that `node` covers, and its children `2 * node + 1` and `2 * node + 2` hold the two halves, so any range is a few whole nodes and any slot sits under one node per level.
2`update` walks to the leaf for `index`, sets it, then recomputes `self.tree[node]` from both children on the way back up; `query` returns the stored sum inside `[ql, qr]`, `0` outside, and the sum of both halves otherwise.
3`NumArray`: build `SegmentTree(nums)`, `update(index, val)` calls the tree's `update`, `sumRange(left, right)` returns `self.seg.query(left, right)`.
4The trap: after the recursive `update` returns, recompute `self.tree[node] = self.tree[2 * node + 1] + self.tree[2 * node + 2]`, or every sum above the leaf stays stale.

Conceptual Narrative

🧭 Conceptual Foundation & Pattern Intuition

A plain array changes one element in O(1)O(1)O(1) but sums a range in O(N)O(N)O(N). A prefix-sum array sums any range in O(1)O(1)O(1) but needs an O(N)O(N)O(N) rebuild after every change. A segment tree stores the sum of many ranges in a binary tree. Node node covers the slots left..right, and its two children cover the two halves. A range sum then reads a few stored nodes, and a change repairs one path from a leaf to the root. Both take O(log⁡N)O(\log N)O(logN).

🏟️ The Analogy: Team Totals in a Company

A company reports sales by team. Each manager keeps the total of the two groups directly below, and the head of the company keeps the grand total. To total the sales of a stretch of neighbouring teams, you read the totals of a few managers whose groups lie completely inside that stretch. When one team corrects its number, only the managers above that team, up to the head, recompute their totals.

🔑 Why It Works

After every update, self.tree[node] equals the sum of the slots left..right that node covers: update sets the leaf, then recomputes each ancestor from its two children on the way back up. query returns a stored sum only for a node fully inside [ql, qr], returns 0 for a node fully outside, and adds both children otherwise. At most two nodes per level overlap only part of the range, so every call visits O(log⁡N)O(\log N)O(logN) nodes.

  • Not recomputing ancestors: changing only the leaf in update leaves every sum above it stale; on LeetCode Example 1 (nums = [1,3,5], then update(1, 2)) the second sumRange(0, 2) returns 9 instead of 8. Recompute self.tree[node] after the recursive call returns.

  • An overlap test instead of a containment test: query may return self.tree[node] only when ql <= left and right <= qr; a node that merely overlaps the range also holds slots outside it, and sumRange(0, 1) on [1,3,5] would return 9 instead of 4.

  • Adding val to the leaf: update(index, val) replaces the value, so the leaf is set to val. With +=, the second sumRange(0, 2) in Example 1 returns 11 instead of 8.

  • Too little space: 2 * n slots overflow when n is not a power of two; allocate 4 * n.

  • Rebuilding the whole tree on every update: correct, but each call then costs O(N); with 3 * 104 calls on 3 * 104 elements that is about 10^9 steps.

Senior SWE Reasoning Architecture

4-Phase Thought Process Model

Pattern Recognition Signals

The 10-second spot

"Change one element" mixed with "sum of a contiguous stretch", many times and in any order: a prefix array rebuilds in O(N) per change, and a plain array sums in O(N). Point updates plus range sums fit a Fenwick tree or a segment tree. The segment tree is the one to know when a node must store more than a prefix difference can give, such as a maximum.

Formulating the Predicate & Invariants

Turning intuition into a boolean rule

self.tree[node] always equals the sum of the slots left..right that node covers; update keeps it true by recomputing each ancestor from its two children, and query returns a stored sum only when ql <= left and right <= qr.

Silent Failure Traps & Edge Cases

Where confident candidates still lose points

This problem's traps are in Common Pitfalls above.

The 60-Second Interview Pitch

Say this out loud before you type a single line

I'd use a Segment Tree, because I need point updates and range sums mixed together. Each node stores the sum of the slots it covers, and its two children cover the two halves. A range sum returns a stored sum for a node fully inside the range, zero for a node fully outside, and adds both children for a node that overlaps only part of the range. At most two nodes per level overlap only part of the range, so a query is O(log N). An update walks to the one leaf for the index and sets it. On the way back up it recomputes every ancestor from its two children, and that line is the trap: without it, later queries read old sums. I allocate four times N nodes, because two times N can overflow when N is not a power of two. Building costs O(N) and space is O(N). If the problem only adds to one position and sums a prefix, I would use a Fenwick tree instead, because it is shorter.

Big-O Invariant Derivation

Complexity & Mathematical Proof

TIME COMPLEXITY

O(N) build, O(log N) update & query

Look at update: it follows one path from the root to a leaf, and each call halves the range, so the depth is about log2(N) + 1. It does O(1) work per node on the way back up: O(log N). Look at query: a node fully inside or fully outside the range returns at once. At most two nodes per level overlap only part of the range, so the calls per level stay at most four and the total is O(log N). _build visits each of the about 2N nodes once and does O(1) work per node: O(N). NumArray.update is one tree update and sumRange is one tree query.

SPACE COMPLEXITY

O(N)

self.tree has 4 * N slots: O(N). The recursion is at most about log2(N) + 1 calls deep, which is O(log N) of call stack.

Formal Recurrence Relation

T(update) = T(query) = O(log N); build = O(N)

Derivation Progression

Build

about 2N nodes × O(1) = O(N)

_build fills each leaf once and combines each inner node once.

Point update

depth × O(1) = O(log N)

One path down to the leaf, one recompute per ancestor on the way up.

Range sum

at most 4 calls per level × O(log N) levels = O(log N)

Only nodes that overlap part of the range split; at most two per level do.

Variable Definitions

NNN

Length of nums

nodenodenode

A tree slot; its children are 2 * node + 1 and 2 * node + 2

left..rightleft..rightleft..right

The slots of nums that node covers

Memory Architecture & Bounds

🟣 Call Stack

O(log N): the recursion is one call per level

🔵 Auxiliary Heap

O(N): tree has 4N slots

🟢 Output Space

O(1) per call

Boundary Best / Worst Cases

Best Case

O(1)O(1)O(1) for a query whose range is exactly the whole array: the root is fully inside

Average Case

O(log⁡N)O(\log N)O(logN) per operation; O(N)O(N)O(N) to build

Worst Case

O(log⁡N)O(\log N)O(logN) per operation

Recurrence Tree Topology

Recurrence Tree Topology
Synthesizing vector architecture diagram...
Staff+ Engineering Perspective

Senior SWE Deconstruction & Hardware Caveats

ARCHITECTURAL SIGNALS & INTERVIEW TRIGGERS

Triggers: "change one element", "sum of a contiguous stretch", "in any order". Point updates mixed with range sums: a Segment Tree whose node stores the sum of its range (a range sum reads a few whole nodes, an update repairs one path).

CONSTRAINTS & BOUNDS

N≤3×104N \le 3 \times 10^4N≤3×104 values in [−100,100][-100, 100][−100,100] and at most 3×1043 \times 10^43×104 calls. Sums stay within ±3×106\pm 3 \times 10^6±3×106. Naive: up to 9×1089 \times 10^89×108 steps; segment tree: about 3×104⋅163 \times 10^4 \cdot 163×104⋅16 node visits, since the tree is about 16 levels deep.

FAANG PRODUCTION TRAPS & EDGE CASES

In a concurrent service, an update rewrites one node per level from the leaf to the root. A reader that runs between two of those writes adds a new leaf to an old ancestor, so guard the walk with a lock, or build the changed path as new nodes and swap the root in one step.

© 2026 Hi👋WebEnterprise. All rights reserved.
Sitemap•llms.txt•