
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://faradawn.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://faradawn.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2025-10-22T05:09:07+00:00</updated><id>https://faradawn.github.io/feed.xml</id><title type="html">Zeyuan (Faradawn) Yang</title><subtitle>Researcher in distributed systems and ML.</subtitle><author><name>Zeyuan Yang</name></author><entry><title type="html">ICPC and LLDB GDB</title><link href="https://faradawn.github.io/ipcp/" rel="alternate" type="text/html" title="ICPC and LLDB GDB" /><published>2022-10-09T00:00:00+00:00</published><updated>2022-10-09T00:00:00+00:00</updated><id>https://faradawn.github.io/ipcp</id><content type="html" xml:base="https://faradawn.github.io/ipcp/"><![CDATA[<h3 id="fast-read-cin">Fast Read Cin</h3>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="nb">false</span><span class="p">);</span>
<span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="nb">NULL</span><span class="p">);</span>
<span class="kt">int</span> <span class="n">tt</span><span class="p">;</span>
<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">tt</span><span class="p">;</span>
</code></pre></div></div>

<h3 id="lldb">LLDB</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>g++ -g -std=c++17 temp.cpp; ./a.out
lldb a.out (or, target create a.out)
b func1
run
bt
n (step over)
s (step in)
</code></pre></div></div>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[Fast Read Cin ios::sync_with_stdio(false); cin.tie(NULL); int tt; cin &gt;&gt; tt; LLDB g++ -g -std=c++17 temp.cpp; ./a.out lldb a.out (or, target create a.out) b func1 run bt n (step over) s (step in)]]></summary></entry><entry><title type="html">Binary Index Tree, Trie, and KMP</title><link href="https://faradawn.github.io/binary-index-tree/" rel="alternate" type="text/html" title="Binary Index Tree, Trie, and KMP" /><published>2022-09-23T00:00:00+00:00</published><updated>2022-09-23T00:00:00+00:00</updated><id>https://faradawn.github.io/binary-index-tree</id><content type="html" xml:base="https://faradawn.github.io/binary-index-tree/"><![CDATA[<h2 id="part-1---binary-index-tree">Part 1 - Binary Index Tree</h2>
<ul>
  <li><code class="language-plaintext highlighter-rouge">query</code>, sum all nodes from <code class="language-plaintext highlighter-rouge">idx + 1</code> to <code class="language-plaintext highlighter-rouge">0</code>, using <code class="language-plaintext highlighter-rouge">getParent</code></li>
  <li><code class="language-plaintext highlighter-rouge">update</code>, add diff to nodes from <code class="language-plaintext highlighter-rouge">idx + 1</code> to <code class="language-plaintext highlighter-rouge">arr.size</code>, using <code class="language-plaintext highlighter-rouge">getNext</code></li>
  <li><a href="https://www.youtube.com/watch?v=CWDQJGaN1gY">Youtube Tutorial</a> and <a href="https://github.com/mission-peace/interview/blob/master/src/com/interview/tree/FenwickTree.java">Java Implementation</a> 
<img src="/assets/img/algo_graphs/binary-index-tree-min.jpeg" alt="" /></li>
</ul>

<h2 id="part-2---trie">Part 2 - Trie</h2>
<ul>
  <li>Article <a href="https://mp.weixin.qq.com/s/hGrTUmM1zusPZZ0nA9aaNw">labuladong trie</a></li>
</ul>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[Part 1 - Binary Index Tree query, sum all nodes from idx + 1 to 0, using getParent update, add diff to nodes from idx + 1 to arr.size, using getNext Youtube Tutorial and Java Implementation]]></summary></entry><entry><title type="html">Trie: String Split</title><link href="https://faradawn.github.io/string-split/" rel="alternate" type="text/html" title="Trie: String Split" /><published>2022-09-22T00:00:00+00:00</published><updated>2022-09-22T00:00:00+00:00</updated><id>https://faradawn.github.io/string-split</id><content type="html" xml:base="https://faradawn.github.io/string-split/"><![CDATA[<h3 id="1---word-break-i-dp">1 - Word Break I (DP)</h3>
<p><a href="https://leetcode.com/problems/word-break/discuss/43814/C%2B%2B-Dynamic-Programming-simple-and-fast-solution-(4ms)-with-optimization">139. Word Break I</a>. Given a string s and a dictionary of strings wordDict, return true if s can be segmented into a space-separated sequence of one or more dictionary words.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Input: s = "leetcode", wordDict = ["leet","code"]
Output: true
Explanation: Return true because "leetcode" can be segmented as "leet code".
</code></pre></div></div>
<p>Solution:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">dp[i]</code> records whether the word before <code class="language-plaintext highlighter-rouge">i</code> can be split.</li>
  <li>for each <code class="language-plaintext highlighter-rouge">i</code>, check if any <code class="language-plaintext highlighter-rouge">substr(j, i)</code> is in <code class="language-plaintext highlighter-rouge">dict</code> and <code class="language-plaintext highlighter-rouge">dp[j] = 1</code>.</li>
</ul>

<hr />

<h3 id="2---word-break-ii-backtracking">2 - Word Break II (Backtracking)</h3>
<p><a href="https://leetcode.com/problems/word-break-ii/">140. Word Break II</a>. 
Given a string s and a dictionary of strings wordDict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences in any order.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Input: s = "catsanddog", wordDict = ["cat","cats","and","sand","dog"]
Output: ["cats and dog","cat sand dog"]
</code></pre></div></div>

<p>Solution:</p>
<ul>
  <li>Backtrack from s[0, …], each time try a dict word with <code class="language-plaintext highlighter-rouge">len</code>.</li>
  <li>If word matches, continue match <code class="language-plaintext highlighter-rouge">s[idx + len, ...]</code>.</li>
  <li>End with <code class="language-plaintext highlighter-rouge">idx == s.length()</code></li>
</ul>

<h3 id="3--">3 -</h3>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[1 - Word Break I (DP) 139. Word Break I. Given a string s and a dictionary of strings wordDict, return true if s can be segmented into a space-separated sequence of one or more dictionary words. Input: s = "leetcode", wordDict = ["leet","code"] Output: true Explanation: Return true because "leetcode" can be segmented as "leet code". Solution: dp[i] records whether the word before i can be split. for each i, check if any substr(j, i) is in dict and dp[j] = 1.]]></summary></entry><entry><title type="html">DP: Longest Common Subsequence</title><link href="https://faradawn.github.io/longest-common-string/" rel="alternate" type="text/html" title="DP: Longest Common Subsequence" /><published>2022-09-19T00:00:00+00:00</published><updated>2022-09-19T00:00:00+00:00</updated><id>https://faradawn.github.io/longest-common-string</id><content type="html" xml:base="https://faradawn.github.io/longest-common-string/"><![CDATA[<h2 id="1---longest-common-subarray">1 - Longest Common Subarray</h2>
<blockquote>
  <p>Given two integer arrays nums1 and nums2, return the maximum length of a subarray that appears in both arrays.</p>
  <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Input: nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
Output: 3
Explanation: The repeated subarray with maximum length is [3,2,1].
</code></pre></div>  </div>
  <p>Solution: dp O(n^2)</p>
</blockquote>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span><span class="p">(</span><span class="n">nums1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">nums2</span><span class="p">[</span><span class="n">j</span><span class="p">]){</span>
    <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="n">and</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">){</span>
        <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span><span class="k">else</span><span class="p">{</span>
        <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">res</span><span class="p">)</span>
        <span class="n">res</span> <span class="o">=</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="2---longest-common-subsequence">2 - Longest common subsequence</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Input: text1 = "abcde", text2 = "ace" 
Output: 3  
Explanation: The longest common subsequence is "ace" and its length is 3.
</code></pre></div></div>

<p>Solution: dp is longest common subseq of s1[0, i] and s2[0, j]</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="p">(</span><span class="n">s1</span><span class="p">.</span><span class="n">charAt</span><span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="n">s2</span><span class="p">.</span><span class="n">charAt</span><span class="p">(</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="p">{</span>
    <span class="c1">// s1[i-1] 和 s2[j-1] 必然在 lcs 中</span>
    <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">];</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
    <span class="c1">// s1[i-1] 和 s2[j-1] 至少有一个不在 lcs 中</span>
    <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">Math</span><span class="p">.</span><span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">],</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]);</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[1 - Longest Common Subarray Given two integer arrays nums1 and nums2, return the maximum length of a subarray that appears in both arrays. Input: nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7] Output: 3 Explanation: The repeated subarray with maximum length is [3,2,1]. Solution: dp O(n^2) if(nums1[i] == nums2[j]){ if(i &gt; 0 and j &gt; 0){ dp[i][j] = dp[i-1][j-1] + 1; }else{ dp[i][j] = 1; } if(dp[i][j] &gt; res) res = dp[i][j]; } 2 - Longest common subsequence Input: text1 = "abcde", text2 = "ace" Output: 3 Explanation: The longest common subsequence is "ace" and its length is 3. Solution: dp is longest common subseq of s1[0, i] and s2[0, j] if (s1.charAt(i - 1) == s2.charAt(j - 1)) { // s1[i-1] 和 s2[j-1] 必然在 lcs 中 dp[i][j] = 1 + dp[i - 1][j - 1]; } else { // s1[i-1] 和 s2[j-1] 至少有一个不在 lcs 中 dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]); }]]></summary></entry><entry><title type="html">System: process, thread, and files</title><link href="https://faradawn.github.io/system-process/" rel="alternate" type="text/html" title="System: process, thread, and files" /><published>2022-09-13T00:00:00+00:00</published><updated>2022-09-13T00:00:00+00:00</updated><id>https://faradawn.github.io/system-process</id><content type="html" xml:base="https://faradawn.github.io/system-process/"><![CDATA[<h2 id="part-1-processes-and-threads">Part 1: Processes and Threads</h2>
<ul>
  <li>Process and threads use the same <code class="language-plaintext highlighter-rouge">task_struct</code>
    <div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">struct</span> <span class="nc">task_struct</span> <span class="p">{</span>
      <span class="kt">long</span>			  <span class="n">state</span><span class="p">;</span>
      <span class="k">struct</span> <span class="nc">mm_struct</span>  <span class="o">*</span><span class="n">mm</span><span class="p">;</span>
      <span class="n">pid_t</span>			  <span class="n">pid</span><span class="p">;</span>
      <span class="c1">// 指向父进程的指针</span>
      <span class="k">struct</span> <span class="nc">task_struct</span> <span class="n">__rcu</span>  <span class="o">*</span><span class="n">parent</span><span class="p">;</span>
      <span class="c1">// 子进程列表</span>
      <span class="k">struct</span> <span class="nc">list_head</span>		<span class="n">children</span><span class="p">;</span>
      <span class="c1">// 存放文件系统信息的指针</span>
      <span class="k">struct</span> <span class="nc">fs_struct</span>		<span class="o">*</span><span class="n">fs</span><span class="p">;</span>
      <span class="c1">// 一个数组，包含该进程打开的文件指针</span>
      <span class="k">struct</span> <span class="nc">files_struct</span>		<span class="o">*</span><span class="n">files</span><span class="p">;</span>
  <span class="p">};</span>
</code></pre></div>    </div>
  </li>
  <li>Threads inherits parent process’s memory and files
    <ul>
      <li>but child process copies parent’s memory and files</li>
      <li>so threads need lock, but processes don’t 
  <img src="https://labuladong.github.io/algo/images/linuxProcess/8.jpg" alt="process and child thread" width="80%" /></li>
    </ul>
  </li>
  <li>Both creation in Linux are fast
    <ul>
      <li>process creation uses <code class="language-plaintext highlighter-rouge">copy-on-write</code>, so only copies parent’s memory space when write</li>
    </ul>
  </li>
</ul>

<h2 id="part-2---programming-concurrency">Part 2 - Programming Concurrency</h2>

<h3 id="1---thread-counter-with-mutex">1 - Thread counter with mutex</h3>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">mutex</span> <span class="n">mtx</span><span class="p">;</span>

<span class="kt">void</span> <span class="nf">incr</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
    <span class="n">mtx</span><span class="p">.</span><span class="n">lock</span><span class="p">();</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">counter</span> <span class="o">++</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">mtx</span><span class="p">.</span><span class="n">unlock</span><span class="p">();</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="kr">thread</span> <span class="n">threads</span><span class="p">[</span><span class="mi">5</span><span class="p">];</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">threads</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="kr">thread</span><span class="p">(</span><span class="n">incr</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">threads</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">join</span><span class="p">();</span>
    <span class="p">}</span>
    <span class="c1">// put this after join threads </span>
    <span class="n">cout</span><span class="o">&lt;&lt;</span><span class="s">"counter is "</span><span class="o">&lt;&lt;</span> <span class="n">counter</span><span class="o">&lt;&lt;</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[Part 1: Processes and Threads Process and threads use the same task_struct struct task_struct { long state; struct mm_struct *mm; pid_t pid; // 指向父进程的指针 struct task_struct __rcu *parent; // 子进程列表 struct list_head children; // 存放文件系统信息的指针 struct fs_struct *fs; // 一个数组，包含该进程打开的文件指针 struct files_struct *files; }; Threads inherits parent process’s memory and files but child process copies parent’s memory and files so threads need lock, but processes don’t Both creation in Linux are fast process creation uses copy-on-write, so only copies parent’s memory space when write Part 2 - Programming Concurrency 1 - Thread counter with mutex int counter = 0; mutex mtx; void incr(int n){ mtx.lock(); for(int i = 0; i &lt; n; i++){ counter ++; } mtx.unlock(); } int main(){ thread threads[5]; for(int i = 0; i &lt; 5; i++){ threads[i] = thread(incr, 1000); } for(int i = 0; i &lt; 5; i++){ threads[i].join(); } // put this after join threads cout&lt;&lt;"counter is "&lt;&lt; counter&lt;&lt;endl; }]]></summary></entry><entry><title type="html">Segment Tree: Max and Sum</title><link href="https://faradawn.github.io/segtree/" rel="alternate" type="text/html" title="Segment Tree: Max and Sum" /><published>2022-09-11T00:00:00+00:00</published><updated>2022-09-11T00:00:00+00:00</updated><id>https://faradawn.github.io/segtree</id><content type="html" xml:base="https://faradawn.github.io/segtree/"><![CDATA[<h3 id="max-segment-tree-accepted">Max Segment Tree (Accepted)</h3>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MaxSegTree</span><span class="p">{</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">t</span><span class="p">;</span>
<span class="nl">public:</span>
    <span class="n">MaxSegTree</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">nums</span><span class="p">){</span>
        <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">nums</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
        <span class="n">t</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="n">n</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
        <span class="n">build</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="n">build</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">nums</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">tl</span> <span class="o">==</span> <span class="n">tr</span><span class="p">){</span>
            <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums</span><span class="p">[</span><span class="n">tl</span><span class="p">];</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="n">build</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
        <span class="n">build</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
        <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">]);</span>
    <span class="p">}</span>

    <span class="c1">// update index to val</span>
    <span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">idx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">val</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">tl</span> <span class="o">==</span> <span class="n">tr</span><span class="p">){</span>
            <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span><span class="p">;</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>        
        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">idx</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">){</span>
            <span class="n">update</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
            <span class="n">update</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">]);</span>
    <span class="p">}</span>

    <span class="c1">// search from l to r</span>
    <span class="kt">int</span> <span class="n">query</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">tl</span> <span class="n">and</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="n">tr</span><span class="p">){</span>
            <span class="k">return</span> <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">];</span>
        <span class="p">}</span><span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&gt;</span> <span class="n">tr</span> <span class="n">or</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="n">tl</span><span class="p">){</span>
            <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span><span class="k">else</span> <span class="p">{</span>
            <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
            <span class="k">return</span> <span class="n">max</span><span class="p">(</span><span class="n">query</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">),</span> <span class="n">query</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">));</span>
        <span class="p">}</span>

    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h3 id="sum-segment-tree-solution">Sum Segment Tree (Solution)</h3>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">SegmentTree</span> <span class="p">{</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">seg</span><span class="p">;</span> <span class="c1">// Segment Tree to be stored in a vector.</span>
<span class="nl">public:</span>
    <span class="n">SegmentTree</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">nums</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">nums</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
        <span class="n">seg</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="n">n</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>  <span class="c1">// Maximum size of a segment tree for an array of size n is 4n</span>
        <span class="n">buildTree</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">// Build the segment tree</span>
    <span class="p">}</span>
    <span class="kt">void</span> <span class="n">buildTree</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">nums</span><span class="p">,</span> <span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="kt">int</span> <span class="n">left</span><span class="p">,</span> <span class="kt">int</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">left</span> <span class="o">==</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">seg</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">nums</span><span class="p">[</span><span class="n">left</span><span class="p">];</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">left</span> <span class="o">+</span> <span class="p">(</span><span class="n">right</span> <span class="o">-</span> <span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="n">buildTree</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
        <span class="n">buildTree</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">right</span><span class="p">);</span>
        <span class="n">seg</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">seg</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">seg</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
    <span class="p">}</span>
    <span class="kt">void</span> <span class="n">updateTree</span><span class="p">(</span><span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="kt">int</span> <span class="n">left</span><span class="p">,</span> <span class="kt">int</span> <span class="n">right</span><span class="p">,</span> <span class="kt">int</span> <span class="n">idx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">val</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// no overlap</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">idx</span> <span class="o">&lt;</span> <span class="n">left</span> <span class="o">||</span> <span class="n">idx</span> <span class="o">&gt;</span> <span class="n">right</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
        
        <span class="c1">// total overlap</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">left</span> <span class="o">==</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">left</span> <span class="o">==</span> <span class="n">idx</span><span class="p">)</span> <span class="n">seg</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span><span class="p">;</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">// partial overlap</span>
        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">left</span> <span class="o">+</span> <span class="p">(</span><span class="n">right</span> <span class="o">-</span> <span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="n">updateTree</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">val</span><span class="p">);</span>
        <span class="n">updateTree</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">right</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">val</span><span class="p">);</span>
        <span class="n">seg</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">seg</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">seg</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
    <span class="p">}</span>
    
    <span class="kt">int</span> <span class="n">queryTree</span><span class="p">(</span><span class="kt">int</span> <span class="n">qleft</span><span class="p">,</span> <span class="kt">int</span> <span class="n">qright</span><span class="p">,</span> <span class="kt">int</span> <span class="n">left</span><span class="p">,</span> <span class="kt">int</span> <span class="n">right</span><span class="p">,</span> <span class="kt">int</span> <span class="n">pos</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">qleft</span> <span class="o">&lt;=</span> <span class="n">left</span> <span class="o">&amp;&amp;</span> <span class="n">qright</span> <span class="o">&gt;=</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// total overlap</span>
            <span class="k">return</span> <span class="n">seg</span><span class="p">[</span><span class="n">pos</span><span class="p">];</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">qleft</span> <span class="o">&gt;</span> <span class="n">right</span> <span class="o">||</span> <span class="n">qright</span> <span class="o">&lt;</span> <span class="n">left</span><span class="p">)</span>  <span class="p">{</span>  <span class="c1">// no overlap</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">// partial overlap</span>
        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">left</span> <span class="o">+</span> <span class="p">(</span><span class="n">right</span> <span class="o">-</span> <span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="k">return</span> <span class="n">queryTree</span><span class="p">(</span><span class="n">qleft</span><span class="p">,</span> <span class="n">qright</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">queryTree</span><span class="p">(</span><span class="n">qleft</span><span class="p">,</span> <span class="n">qright</span><span class="p">,</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">right</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">pos</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h3 id="segment-tree-vector-version-tle">Segment Tree vector version (TLE)</h3>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">SegTree</span><span class="p">{</span>
    <span class="nl">public:</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">t</span><span class="p">;</span>

    <span class="c1">// input arr, length of input array</span>
    <span class="n">SegTree</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">arr</span><span class="p">){</span> 
        <span class="n">t</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="n">arr</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="mi">0</span><span class="p">);</span>
        <span class="n">build</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>  <span class="n">arr</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="c1">// input array, cur position, insert elements from tl to tr</span>
    <span class="kt">void</span> <span class="n">build</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">arr</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">tl</span> <span class="o">==</span> <span class="n">tr</span><span class="p">){</span>
            <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">tl</span><span class="p">];</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="n">build</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
        <span class="n">build</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
        <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
    <span class="p">}</span>

    <span class="c1">// get the sum from l to r</span>
    <span class="kt">int</span> <span class="n">getSum</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">tl</span> <span class="n">and</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="n">tr</span><span class="p">){</span>
            <span class="k">return</span> <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">];</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">r</span> <span class="o">&lt;</span> <span class="n">tl</span> <span class="o">||</span> <span class="n">l</span> <span class="o">&gt;</span> <span class="n">tr</span><span class="p">){</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span><span class="p">{</span>
            <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
            <span class="k">return</span> <span class="n">getSum</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">)</span> <span class="o">+</span> <span class="n">getSum</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
        <span class="p">}</span>

    <span class="p">}</span>

    <span class="c1">// set the idx value to val</span>
    <span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">idx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">val</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">tl</span> <span class="o">==</span> <span class="n">tr</span><span class="p">){</span>
            <span class="c1">// cur is index in big tree array, should not equal to tl and tr</span>
            <span class="c1">// cout &lt;&lt; "Updating cur " &lt;&lt; t[cur] &lt;&lt; " to " &lt;&lt; val &lt;&lt; endl;</span>
            <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span><span class="p">;</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">idx</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">){</span>
            <span class="n">update</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
        <span class="p">}</span> 
        <span class="k">else</span> <span class="p">{</span>
            <span class="n">update</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">];</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h3 id="segment-tree-array-version-didnt-test">Segment Tree Array version (Didn’t test)</h3>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">SegTree</span><span class="p">{</span>
    <span class="nl">public:</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">t</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">t_len</span><span class="p">;</span>

    <span class="c1">// input arr, length of input array</span>
    <span class="n">SegTree</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">arr</span><span class="p">,</span> <span class="kt">int</span> <span class="n">len</span><span class="p">){</span> 
        <span class="n">t_len</span> <span class="o">=</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">len</span><span class="p">;</span> <span class="c1">// if power of 2, t_len = 2 * len - 1</span>
        <span class="n">t</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="p">[</span><span class="n">t_len</span><span class="p">];</span>
        <span class="n">build</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">len</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="c1">// input array, cur position, insert elements from tl to tr</span>
    <span class="kt">void</span> <span class="n">build</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">arr</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">tl</span> <span class="o">==</span> <span class="n">tr</span><span class="p">){</span>
            <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">tl</span><span class="p">];</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="n">build</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
        <span class="n">build</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
        <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">cur</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
    <span class="p">}</span>

    <span class="c1">// get the sum from l to r</span>
    <span class="kt">int</span> <span class="n">getSum</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">tl</span> <span class="n">and</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="n">tr</span><span class="p">){</span>
            <span class="k">return</span> <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">];</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">r</span> <span class="o">&lt;</span> <span class="n">tl</span> <span class="o">||</span> <span class="n">l</span> <span class="o">&gt;</span> <span class="n">tr</span><span class="p">){</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span><span class="p">{</span>
            <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
            <span class="k">return</span> <span class="n">getSum</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">)</span> <span class="o">+</span> <span class="n">getSum</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
        <span class="p">}</span>

    <span class="p">}</span>

    <span class="c1">// set the idx value to val</span>
    <span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">idx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">val</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cur</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tl</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tr</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">tl</span> <span class="o">==</span> <span class="n">tr</span><span class="p">){</span>
            <span class="c1">// cur is index in big tree array, should not equal to tl and tr</span>
            <span class="c1">// cout &lt;&lt; "Updating cur " &lt;&lt; t[cur] &lt;&lt; " to " &lt;&lt; val &lt;&lt; endl;</span>
            <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span><span class="p">;</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">tl</span> <span class="o">+</span> <span class="p">(</span><span class="n">tr</span> <span class="o">-</span> <span class="n">tl</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">idx</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">){</span>
            <span class="n">update</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tl</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
        <span class="p">}</span> 
        <span class="k">else</span> <span class="p">{</span>
            <span class="n">update</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="n">t</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">cur</span><span class="o">+</span><span class="mi">2</span><span class="p">];</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="n">show</span><span class="p">(){</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">t_len</span><span class="p">;</span> <span class="n">i</span> <span class="o">++</span><span class="p">){</span>
            <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">" "</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[Max Segment Tree (Accepted) class MaxSegTree{ vector&lt;int&gt; t; public: MaxSegTree(vector&lt;int&gt; &amp;nums){ int n = nums.size(); t.resize(4 * n, 0); build(nums, 0, 0, n-1); } void build(vector&lt;int&gt; &amp;nums, int cur, int tl, int tr){ if(tl == tr){ t[cur] = nums[tl]; return; } int mid = tl + (tr - tl) / 2; build(nums, 2*cur+1, tl, mid); build(nums, 2*cur+2, mid+1, tr); t[cur] = max(t[2*cur+1], t[2*cur+2]); } // update index to val void update(int idx, int val, int cur, int tl, int tr){ if(tl == tr){ t[cur] = val; return; } int mid = tl + (tr - tl) / 2; if(idx &lt;= mid){ update(idx, val, 2*cur+1, tl, mid); }else{ update(idx, val, 2*cur+2, mid+1, tr); } t[cur] = max(t[2*cur+1], t[2*cur+2]); } // search from l to r int query(int l, int r, int cur, int tl, int tr){ if(l &lt;= tl and r &gt;= tr){ return t[cur]; }else if(l &gt; tr or r &lt; tl){ return -1; }else { int mid = tl + (tr - tl) / 2; return max(query(l, r, 2*cur+1, tl, mid), query(l, r, 2*cur+2, mid+1, tr)); } } }; Sum Segment Tree (Solution) class SegmentTree { vector&lt;int&gt; seg; // Segment Tree to be stored in a vector. public: SegmentTree(vector&lt;int&gt;&amp; nums) { int n = nums.size(); seg.resize(4 * n, 0); // Maximum size of a segment tree for an array of size n is 4n buildTree(nums, 0, 0, n - 1); // Build the segment tree } void buildTree(vector&lt;int&gt;&amp; nums, int pos, int left, int right) { if (left == right) { seg[pos] = nums[left]; return; } int mid = left + (right - left) / 2; buildTree(nums, 2 * pos + 1, left, mid); buildTree(nums, 2 * pos + 2, mid + 1, right); seg[pos] = seg[2 * pos + 1] + seg[2 * pos + 2]; } void updateTree(int pos, int left, int right, int idx, int val) { // no overlap if (idx &lt; left || idx &gt; right) return; // total overlap if (left == right) { if (left == idx) seg[pos] = val; return; } // partial overlap int mid = left + (right - left) / 2; updateTree(2 * pos + 1, left, mid, idx, val); updateTree(2 * pos + 2, mid + 1, right, idx, val); seg[pos] = seg[2 * pos + 1] + seg[2 * pos + 2]; } int queryTree(int qleft, int qright, int left, int right, int pos) { if (qleft &lt;= left &amp;&amp; qright &gt;= right) { // total overlap return seg[pos]; } if (qleft &gt; right || qright &lt; left) { // no overlap return 0; } // partial overlap int mid = left + (right - left) / 2; return queryTree(qleft, qright, left, mid, 2 * pos + 1) + queryTree(qleft, qright, mid + 1, right, 2 * pos + 2); } };]]></summary></entry><entry><title type="html">Monotonic queue: Max for sliding window</title><link href="https://faradawn.github.io/mono-queue/" rel="alternate" type="text/html" title="Monotonic queue: Max for sliding window" /><published>2022-09-05T00:00:00+00:00</published><updated>2022-09-05T00:00:00+00:00</updated><id>https://faradawn.github.io/mono-queue</id><content type="html" xml:base="https://faradawn.github.io/mono-queue/"><![CDATA[<h2 id="part-1---max-in-sliding-window">Part 1 - Max in sliding window</h2>
<ul>
  <li>Use a monotonic queue O(n)</li>
</ul>

<p><img src="/assets/img/algo_graphs/max_mono_queue-min.JPG" alt="mono_queue_max" width="90%" /></p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">maxSlidingWindow</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">nums</span><span class="p">,</span> <span class="kt">int</span> <span class="n">k</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// queue of indecies</span>
        <span class="n">deque</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">q</span><span class="p">;</span>
        <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">res</span><span class="p">;</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">nums</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="c1">// remove outlated indecies</span>
            <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">()</span> <span class="n">and</span> <span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="n">i</span> <span class="o">-</span> <span class="n">k</span><span class="p">){</span>
                <span class="n">q</span><span class="p">.</span><span class="n">pop_front</span><span class="p">();</span>
            <span class="p">}</span>
            <span class="c1">// remove the smaller elements</span>
            <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">()</span> <span class="n">and</span> <span class="n">nums</span><span class="p">[</span><span class="n">q</span><span class="p">.</span><span class="n">back</span><span class="p">()]</span> <span class="o">&lt;</span> <span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]){</span>
                <span class="n">q</span><span class="p">.</span><span class="n">pop_back</span><span class="p">();</span>
            <span class="p">}</span>
            
            <span class="n">q</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
            <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="n">k</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">){</span>
                <span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">nums</span><span class="p">[</span><span class="n">q</span><span class="p">.</span><span class="n">front</span><span class="p">()]);</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<ul>
  <li>Multiset method O(nlogn)</li>
</ul>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">maxSlidingWindow</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">nums</span><span class="p">,</span> <span class="kt">int</span> <span class="n">k</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">multiset</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">s</span><span class="p">;</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">k</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">s</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
        <span class="p">}</span>
        <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">res</span><span class="p">;</span>
        <span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">s</span><span class="p">.</span><span class="n">rbegin</span><span class="p">()));</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">k</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">nums</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">s</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">s</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="n">k</span><span class="p">]));</span>
            <span class="n">s</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">s</span><span class="p">.</span><span class="n">rbegin</span><span class="p">()));</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[Part 1 - Max in sliding window Use a monotonic queue O(n) class Solution { public: vector&lt;int&gt; maxSlidingWindow(vector&lt;int&gt;&amp; nums, int k) { // queue of indecies deque&lt;int&gt; q; vector&lt;int&gt; res; for(int i = 0; i &lt; nums.size(); i++){ // remove outlated indecies while(!q.empty() and q.front() &lt;= i - k){ q.pop_front(); } // remove the smaller elements while(!q.empty() and nums[q.back()] &lt; nums[i]){ q.pop_back(); } q.push_back(i); if(i - k + 1 &gt;= 0){ res.push_back(nums[q.front()]); } } return res; } }; Multiset method O(nlogn) class Solution { public: vector&lt;int&gt; maxSlidingWindow(vector&lt;int&gt;&amp; nums, int k) { multiset&lt;int&gt; s; for(int i = 0; i &lt; k; i++){ s.insert(nums[i]); } vector&lt;int&gt; res; res.push_back(*(s.rbegin())); for(int i = k; i &lt; nums.size(); i++){ s.erase(s.find(nums[i-k])); s.insert(nums[i]); res.push_back(*(s.rbegin())); } return res; } };]]></summary></entry><entry><title type="html">System design</title><link href="https://faradawn.github.io/system-design/" rel="alternate" type="text/html" title="System design" /><published>2022-09-04T00:00:00+00:00</published><updated>2022-09-04T00:00:00+00:00</updated><id>https://faradawn.github.io/system-design</id><content type="html" xml:base="https://faradawn.github.io/system-design/"><![CDATA[<h2 id="part-1---design-an-iterator-to-flatten-nestedlist">Part 1 - Design an iterator to flatten nestedList</h2>

<h3 id="method-1-use-dfs-to-traverse-all-the-leaf-of-a-m-way-tree">Method 1: use dfs to traverse all the leaf of a M-way tree</h3>
<ul>
  <li>Put in vector and build a vector iterator</li>
</ul>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">NestedIterator</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">end</span><span class="p">;</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">res</span><span class="p">;</span>
    
    <span class="n">NestedIterator</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">NestedInteger</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">nestedList</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="n">NestedInteger</span><span class="o">&amp;</span> <span class="n">list</span> <span class="o">:</span> <span class="n">nestedList</span><span class="p">){</span>
            <span class="n">dfs</span><span class="p">(</span><span class="n">list</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="n">it</span> <span class="o">=</span> <span class="n">res</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span>
        <span class="n">end</span> <span class="o">=</span> <span class="n">res</span><span class="p">.</span><span class="n">end</span><span class="p">();</span>
    <span class="p">}</span>
    
    <span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="n">NestedInteger</span><span class="o">&amp;</span> <span class="n">root</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">isInteger</span><span class="p">()){</span>
            <span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">getInteger</span><span class="p">());</span>
        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
            <span class="k">for</span><span class="p">(</span><span class="n">NestedInteger</span><span class="o">&amp;</span> <span class="n">list</span> <span class="o">:</span> <span class="n">root</span><span class="p">.</span><span class="n">getList</span><span class="p">()){</span>
                <span class="n">dfs</span><span class="p">(</span><span class="n">list</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="kt">int</span> <span class="n">next</span><span class="p">()</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="o">*</span><span class="n">it</span><span class="p">;</span>
        <span class="n">it</span><span class="o">++</span><span class="p">;</span>
        <span class="k">return</span> <span class="n">a</span><span class="p">;</span>
    <span class="p">}</span>
    
    <span class="kt">bool</span> <span class="n">hasNext</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">it</span> <span class="o">&lt;</span> <span class="n">end</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h3 id="method-2-remove-first-integer">Method 2: remove first integer</h3>
<ul>
  <li>Using stack to optimize</li>
</ul>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">NestedIterator</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">stack</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">NestedInteger</span><span class="o">&gt;::</span><span class="n">iterator</span><span class="o">&gt;</span><span class="n">begins</span><span class="p">;</span>
    <span class="n">stack</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">NestedInteger</span><span class="o">&gt;::</span><span class="n">iterator</span><span class="o">&gt;</span><span class="n">ends</span><span class="p">;</span>
    
    <span class="n">NestedIterator</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">NestedInteger</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">nestedList</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">begins</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">nestedList</span><span class="p">.</span><span class="n">begin</span><span class="p">());</span>
        <span class="n">ends</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">nestedList</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
    <span class="p">}</span>
    
    <span class="kt">int</span> <span class="n">next</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">return</span> <span class="p">(</span><span class="n">begins</span><span class="p">.</span><span class="n">top</span><span class="p">()</span><span class="o">++</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">getInteger</span><span class="p">();</span>
    <span class="p">}</span>
    
    <span class="kt">bool</span> <span class="n">hasNext</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">begins</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
            <span class="k">if</span><span class="p">(</span><span class="n">begins</span><span class="p">.</span><span class="n">top</span><span class="p">()</span> <span class="o">==</span> <span class="n">ends</span><span class="p">.</span><span class="n">top</span><span class="p">()){</span>
                <span class="n">begins</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
                <span class="n">ends</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
            <span class="p">}</span><span class="k">else</span><span class="p">{</span>
                <span class="n">vector</span><span class="o">&lt;</span><span class="n">NestedInteger</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">x</span> <span class="o">=</span> <span class="n">begins</span><span class="p">.</span><span class="n">top</span><span class="p">();</span>
                <span class="k">if</span><span class="p">((</span><span class="o">*</span><span class="n">x</span><span class="p">).</span><span class="n">isInteger</span><span class="p">()){</span>
                    <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
                <span class="p">}</span><span class="k">else</span><span class="p">{</span>
                    <span class="n">begins</span><span class="p">.</span><span class="n">top</span><span class="p">()</span><span class="o">++</span><span class="p">;</span>
                    <span class="n">begins</span><span class="p">.</span><span class="n">push</span><span class="p">((</span><span class="o">*</span><span class="n">x</span><span class="p">).</span><span class="n">getList</span><span class="p">().</span><span class="n">begin</span><span class="p">());</span>
                    <span class="n">ends</span><span class="p">.</span><span class="n">push</span><span class="p">((</span><span class="o">*</span><span class="n">x</span><span class="p">).</span><span class="n">getList</span><span class="p">().</span><span class="n">end</span><span class="p">());</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="part-2---constant-time-delete">Part 2 - Constant time delete</h2>
<ul>
  <li><a href="https://leetcode.com/problems/insert-delete-getrandom-o1/">380. Insert Delete GetRandom O(1)</a>
    <ul>
      <li>Swap the desired element to vector’s end to pop_back</li>
      <li>Use a map to track the index</li>
    </ul>
  </li>
</ul>

<h2 id="part-3---bit-map-for-repeated-alphabets">Part 3 - Bit map for repeated alphabets</h2>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">partitionString</span><span class="p">(</span><span class="n">string</span> <span class="n">s</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">bitMap</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">s</span><span class="p">.</span><span class="n">length</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="n">bitMap</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="p">)){</span>
                <span class="n">bitMap</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                <span class="n">cnt</span> <span class="o">++</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">bitMap</span> <span class="o">=</span> <span class="n">bitMap</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="p">);</span>
        <span class="p">}</span>   
        <span class="k">return</span> <span class="n">cnt</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[Part 1 - Design an iterator to flatten nestedList Method 1: use dfs to traverse all the leaf of a M-way tree Put in vector and build a vector iterator]]></summary></entry><entry><title type="html">K Sum</title><link href="https://faradawn.github.io/ksum/" rel="alternate" type="text/html" title="K Sum" /><published>2022-09-03T00:00:00+00:00</published><updated>2022-09-03T00:00:00+00:00</updated><id>https://faradawn.github.io/ksum</id><content type="html" xml:base="https://faradawn.github.io/ksum/"><![CDATA[<h2 id="1---two-sum">1 - Two Sum</h2>
<ul>
  <li>Sort</li>
  <li>Use a low and high pointer</li>
  <li>Use while to skip duplicates</li>
</ul>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">TwoSum</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">nums</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">target</span><span class="p">,</span> <span class="kt">int</span> <span class="n">idx</span><span class="p">){</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">res</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">lo</span> <span class="o">=</span> <span class="n">idx</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">hi</span> <span class="o">=</span> <span class="n">nums</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">lo</span> <span class="o">&lt;</span> <span class="n">hi</span><span class="p">){</span>
        <span class="kt">long</span> <span class="kt">long</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">nums</span><span class="p">[</span><span class="n">lo</span><span class="p">]</span> <span class="o">+</span> <span class="n">nums</span><span class="p">[</span><span class="n">hi</span><span class="p">];</span>
        <span class="k">if</span><span class="p">(</span><span class="n">sum</span> <span class="o">&lt;</span> <span class="n">target</span><span class="p">){</span>
            <span class="n">lo</span> <span class="o">++</span><span class="p">;</span>
        <span class="p">}</span><span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">sum</span> <span class="o">&gt;</span> <span class="n">target</span><span class="p">){</span>
            <span class="n">hi</span> <span class="o">--</span><span class="p">;</span>
        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
            <span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">nums</span><span class="p">[</span><span class="n">lo</span><span class="p">],</span> <span class="n">nums</span><span class="p">[</span><span class="n">hi</span><span class="p">]});</span>
            <span class="k">while</span><span class="p">(</span><span class="n">lo</span> <span class="o">&lt;</span> <span class="n">hi</span> <span class="n">and</span> <span class="n">nums</span><span class="p">[</span><span class="n">lo</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">nums</span><span class="p">[</span><span class="n">lo</span><span class="p">])</span> <span class="n">lo</span><span class="o">++</span><span class="p">;</span>
            <span class="k">while</span><span class="p">(</span><span class="n">hi</span> <span class="o">&gt;</span> <span class="n">lo</span> <span class="n">and</span> <span class="n">nums</span><span class="p">[</span><span class="n">hi</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">nums</span><span class="p">[</span><span class="n">hi</span><span class="p">])</span> <span class="n">hi</span><span class="o">--</span><span class="p">;</span>
            <span class="n">lo</span> <span class="o">++</span><span class="p">;</span> <span class="n">hi</span> <span class="o">--</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="2---k-sum">2 - K Sum</h2>
<ul>
  <li>Recursion to reduce to twoSum case</li>
  <li>Remember to skip duplicates during the kSum i loop</li>
  <li>Remember to use long long for target</li>
</ul>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">TwoSum</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">nums</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">target</span><span class="p">,</span> <span class="kt">int</span> <span class="n">idx</span><span class="p">){</span>
        <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">res</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">lo</span> <span class="o">=</span> <span class="n">idx</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">hi</span> <span class="o">=</span> <span class="n">nums</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
        <span class="k">while</span><span class="p">(</span><span class="n">lo</span> <span class="o">&lt;</span> <span class="n">hi</span><span class="p">){</span>
            <span class="kt">long</span> <span class="kt">long</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">nums</span><span class="p">[</span><span class="n">lo</span><span class="p">]</span> <span class="o">+</span> <span class="n">nums</span><span class="p">[</span><span class="n">hi</span><span class="p">];</span>
            <span class="k">if</span><span class="p">(</span><span class="n">sum</span> <span class="o">&lt;</span> <span class="n">target</span><span class="p">){</span>
                <span class="n">lo</span> <span class="o">++</span><span class="p">;</span>
            <span class="p">}</span><span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">sum</span> <span class="o">&gt;</span> <span class="n">target</span><span class="p">){</span>
                <span class="n">hi</span> <span class="o">--</span><span class="p">;</span>
            <span class="p">}</span><span class="k">else</span><span class="p">{</span>
                <span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">nums</span><span class="p">[</span><span class="n">lo</span><span class="p">],</span> <span class="n">nums</span><span class="p">[</span><span class="n">hi</span><span class="p">]});</span>
                <span class="k">while</span><span class="p">(</span><span class="n">lo</span> <span class="o">&lt;</span> <span class="n">hi</span> <span class="n">and</span> <span class="n">nums</span><span class="p">[</span><span class="n">lo</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">nums</span><span class="p">[</span><span class="n">lo</span><span class="p">])</span> <span class="n">lo</span><span class="o">++</span><span class="p">;</span>
                <span class="k">while</span><span class="p">(</span><span class="n">hi</span> <span class="o">&gt;</span> <span class="n">lo</span> <span class="n">and</span> <span class="n">nums</span><span class="p">[</span><span class="n">hi</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">nums</span><span class="p">[</span><span class="n">hi</span><span class="p">])</span> <span class="n">hi</span><span class="o">--</span><span class="p">;</span>
                <span class="n">lo</span> <span class="o">++</span><span class="p">;</span> <span class="n">hi</span> <span class="o">--</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
    <span class="p">}</span>
        
    
    <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">kSum</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">nums</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="kt">int</span> <span class="n">idx</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">target</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">2</span><span class="p">){</span>
            <span class="k">return</span> <span class="n">TwoSum</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">idx</span><span class="p">);</span>
        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
            <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">res</span><span class="p">;</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">idx</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">nums</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">!=</span> <span class="n">idx</span> <span class="n">and</span> <span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
                    <span class="k">continue</span><span class="p">;</span>
                <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">sub</span> <span class="o">=</span> <span class="n">kSum</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">target</span><span class="o">-</span><span class="p">(</span><span class="kt">long</span><span class="p">)</span><span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
                <span class="k">for</span><span class="p">(</span><span class="k">auto</span><span class="o">&amp;</span> <span class="n">vec</span> <span class="o">:</span> <span class="n">sub</span><span class="p">){</span>
                    <span class="n">vec</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
                    <span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">vec</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">fourSum</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">nums</span><span class="p">,</span> <span class="kt">int</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">sort</span><span class="p">(</span><span class="n">nums</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">nums</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
        <span class="k">return</span> <span class="n">kSum</span><span class="p">(</span><span class="n">nums</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">target</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[1 - Two Sum Sort Use a low and high pointer Use while to skip duplicates vector&lt;vector&lt;int&gt;&gt; TwoSum(vector&lt;int&gt;&amp; nums, long long target, int idx){ vector&lt;vector&lt;int&gt;&gt; res; int lo = idx; int hi = nums.size()-1; while(lo &lt; hi){ long long sum = nums[lo] + nums[hi]; if(sum &lt; target){ lo ++; }else if(sum &gt; target){ hi --; }else{ res.push_back({nums[lo], nums[hi]}); while(lo &lt; hi and nums[lo+1] == nums[lo]) lo++; while(hi &gt; lo and nums[hi-1] == nums[hi]) hi--; lo ++; hi --; } } return res; }]]></summary></entry><entry><title type="html">Buy-sell Stock</title><link href="https://faradawn.github.io/stock/" rel="alternate" type="text/html" title="Buy-sell Stock" /><published>2022-09-02T00:00:00+00:00</published><updated>2022-09-02T00:00:00+00:00</updated><id>https://faradawn.github.io/stock</id><content type="html" xml:base="https://faradawn.github.io/stock/"><![CDATA[<h2 id="1---buy-sell-once">1 - Buy-sell once</h2>
<p><img src="/assets/img/algo_graphs/buy-stock-min.jpeg" alt="" /></p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">maxProfit</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">prices</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">notHave</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">have</span> <span class="o">=</span> <span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">notHave</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">notHave</span><span class="p">,</span> <span class="n">have</span> <span class="o">+</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="n">have</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">have</span><span class="p">,</span> <span class="mi">0</span> <span class="o">-</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">notHave</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="2---buy-sell-infinite-times">2 - Buy-sell infinite times</h2>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">maxProfit</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">prices</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">notHave</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">have</span> <span class="o">=</span> <span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">notHave</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">notHave</span><span class="p">,</span> <span class="n">have</span> <span class="o">+</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="n">have</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">have</span><span class="p">,</span> <span class="n">notHave</span> <span class="o">-</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">notHave</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="3---buy-sell-infinite-times-with-cooldown">3 - Buy-sell infinite times with cooldown</h2>
<ul>
  <li><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/">309. Best Time to Buy and Sell Stock with Cooldown</a>
    <ul>
      <li>1 day cooldown to buy again</li>
      <li>need understand why <code class="language-plaintext highlighter-rouge">dp[having stock on day i]</code> is <code class="language-plaintext highlighter-rouge">dp[i-2][notHave]</code></li>
      <li>remember start at i = 2</li>
    </ul>
  </li>
</ul>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">maxProfit</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">prices</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="kt">int</span> <span class="n">notHave</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">have</span> <span class="o">=</span> <span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
        <span class="kt">int</span> <span class="n">prev</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="n">notHave</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">have</span> <span class="o">+</span> <span class="n">prices</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
        <span class="n">have</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">have</span><span class="p">);</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="kt">int</span> <span class="n">temp</span> <span class="o">=</span> <span class="n">notHave</span><span class="p">;</span>
            <span class="n">notHave</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">notHave</span><span class="p">,</span> <span class="n">have</span> <span class="o">+</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="n">have</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">have</span><span class="p">,</span> <span class="n">prev</span> <span class="o">-</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="n">prev</span> <span class="o">=</span> <span class="n">temp</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">notHave</span><span class="p">;</span>
        
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="4---buy-sell-k_max-times">4 - Buy-sell k_max times</h2>
<ul>
  <li>If k_max exceeds half the size, return maxProfitInf</li>
  <li>Remember to initialize the base case of i = 0</li>
</ul>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">maxProfit</span><span class="p">(</span><span class="kt">int</span> <span class="n">k_max</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&amp;</span> <span class="n">prices</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">){</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="n">k_max</span> <span class="o">&gt;</span> <span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">/</span><span class="mi">2</span><span class="p">){</span>
            <span class="k">return</span> <span class="n">maxProfitInf</span><span class="p">(</span><span class="n">prices</span><span class="p">);</span>
        <span class="p">}</span>
        
        <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;&gt;</span><span class="n">dp</span> <span class="p">(</span><span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span><span class="p">(</span><span class="n">k_max</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)));</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;=</span> <span class="n">k_max</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">){</span>
            <span class="n">dp</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">prices</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
        <span class="p">}</span>
        
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;=</span> <span class="n">k_max</span><span class="p">;</span> <span class="n">k</span> <span class="o">++</span><span class="p">){</span>
                <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
                <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="p">}</span>
               
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">dp</span><span class="p">[</span><span class="n">prices</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">k_max</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>]]></content><author><name>Zeyuan Yang</name></author><category term="algo" /><summary type="html"><![CDATA[1 - Buy-sell once class Solution { public: int maxProfit(vector&lt;int&gt;&amp; prices) { int notHave = 0; int have = -prices[0]; for(int i = 1; i &lt; prices.size(); i++){ notHave = max(notHave, have + prices[i]); have = max(have, 0 - prices[i]); } return notHave; } }; 2 - Buy-sell infinite times class Solution { public: int maxProfit(vector&lt;int&gt;&amp; prices) { int notHave = 0; int have = -prices[0]; for(int i = 1; i &lt; prices.size(); i++){ notHave = max(notHave, have + prices[i]); have = max(have, notHave - prices[i]); } return notHave; } };]]></summary></entry></feed>