Blog

Obsidian Daily Planner Plugin

If you’re like me and use Obsidian for note-taking, you might find the Daily Planner plugin extremely useful, especially when combined with a bit of scripting to automate your workflow. Thought I’d add the script I am currently using to generate templates. First, details. Template Details The template starts with the Day Planner section which displays the date for the following day in a clear, readable format. Below this, the template automatically records when the file was created and last modified.

5 layer QMK keyboard layout

New layout iteration on my customized split ergonomic keyboard with a 5-layer layout. Here’s a quick rundown: Base layer: Colemak layout for optimal typing speed and reduced finger movement. QWERTY layer: For when I need to switch back to the standard layout. Controls layer: Mouse keys, media controls, and special characters. Lower layer: Numbers, function keys, and additional symbols. Raise layer: Navigation, editing commands, and more symbols. Source code can be found on my github here

Colemak-DH on Mac

Karabiner-Elements Colemak-DH configuration for Mac. Source: karabiner.json Key features: Vim-style arrow keys (hjkl) Capslock as backspace Word and line deletion (forward/backward) Numpad overlay on vim arrows Custom controls (undo, redo, line navigation, multi-line selection) Karabiner-Elements Configuration Basics: Basic structure: { "from": { "key_code": "q", "modifiers": { "mandatory": [], "optional": [] } }, "to": [ { "key_code": "" } ], "type": "basic" } This structure defines a key remapping. “from” specifies the key to be remapped, “to” defines the new behavior, and “modifiers” allow for complex key combinations.

Finding audio files with Google

On Google type: ?intitle:index.of? *filetype* *filename* OR intitle:"index of" (*filetype*) *filename* -html -htm -php -jsp OR intitle:index.of (*filetype1*|*filetype2*) *filename* -HTML -htm -jsp -asp -php Replace: filetype: with “WAV”, “MP3” or any type of file format. Filename with whatever you are looking for (“clap”, “kick”, “stevie wonder”…). ✅ This is a great way to find sound effects, drum samples, music & obscure/weird sound files in general !

Software Project Questionaire

Project Planning Checklist @khoisan25* General Considerations Scope of the Project: All known Partially known Little known Unknown Project Timeline: Short (less than 3 months) Medium (3 to 6 months) Long (more than 6 months) Project Size: Small (less than 10,000 lines of code or 20 features) Medium (10,000 to 50,000 lines of code or 20 to 100 features) Large (over 50,000 lines of code or 100 features) Budget: Low (under $10,000 USD) Medium ($10,000 to $100,000 USD) High (over $100,000 USD) Delivery Format Software Delivery Method: SaaS PaaS IaaS Mobile App Desktop App Web App Embedded System Platform Compatibility: Windows MacOS Linux iOS Android Other: ____________ Installation Mode: Locally Installed Web Accessed Distribution Model: Open Source Commercially Sold Documentation and Tracking Project Tracking: Can define clear iterations Cannot define clear iterations Required Documentation: Requirements Document Design Document User Manual Developer Manual Other: ____________ Documentation Standard: Informal (Wiki, Google Docs) Formal (IEEE, UML Diagrams) Backend Requirements User Management: Needed Not needed Basic OAuth Database Specifications: Data Type (text, images, etc.

CPP CHEATSHEET

Table of contents Data Types I/O Iterators and Ranges Vectors Sets Maps Unordered Sets and Maps Bitsets Stack and Queue Heap Priority Queue Sorting Algorithms Search Algorithms String Operations Number Theory Geometry Graph Theory Dynamic Programming Computational Geometry Data Structures Advanced Algorithms Kosaraju&rsquo;s SSC Algorithm KMP Algorithm Manacher&rsquo;s Algorithm Suffix Array Z-function BIT and Segment Trees Data Types // int, long, long long, unsigned int, unsigned long, unsigned long long // double, long double // char, string, bool // vector<T>, pair<T1, T2>, set<T> // map<T1, T2>, unordered_map<T1, T2> // queue<T>, stack<T> //priority_queue<T> (by default max heap), priority_queue<int, vector <int>, greater <int>> (min heap) 1.

Enunciation Exercises

This is a collection of English words and phrases designed to help practice proper enunciation and pronunciation. Starter Exercises Perform these simple exercises to warm up your vocal muscles: Open your mouth and say “ah”. Put your tongue behind your top teeth and say “tuh”. Put your tongue behind your bottom teeth and say “duh”. Pucker your lips and say “puh”. Say “ee” like you are screaming. Say “oo” like you are in pain.

CPP CHEATSHEET

Planted December 18, 2020

Table of contents

  1. Data Types
  2. I/O
  3. Iterators and Ranges
  4. Vectors
  5. Sets
  6. Maps
  7. Unordered Sets and Maps
  8. Bitsets
  9. Stack and Queue
  10. Heap
  11. Priority Queue
  12. Sorting Algorithms
  13. Search Algorithms
  14. String Operations
  15. Number Theory
  16. Geometry
  17. Graph Theory
  18. Dynamic Programming
  19. Computational Geometry
  20. Data Structures
  21. Advanced Algorithms
  22. Kosaraju&rsquo;s SSC Algorithm
  23. KMP Algorithm
  24. Manacher&rsquo;s Algorithm
  25. Suffix Array
  26. Z-function
  27. BIT and Segment Trees

Data Types

// int, long, long long, unsigned int, unsigned long, unsigned long long 
// double, long double 
// char, string, bool 
// vector<T>, pair<T1, T2>, set<T> 
// map<T1, T2>, unordered_map<T1, T2> 
// queue<T>, stack<T> 
//priority_queue<T> (by default max heap), priority_queue<int, vector <int>, greater <int>> (min heap)  

1. int: 32 bits
2. long: 32 bits
3. long long: 64 bits
4. unsigned int: 32 bits
5. unsigned long: 32 bits
6. unsigned long long: 64 bits
7. double: 64 bits (15 digits after decimal point) 
8. long double: 80 bits (19 digits after decimal point) 
9. char: 8 bit ASCII character 
10. string: a sequence of characters in memory, like an array of char 
11. bool: can take one of two values, true or false (1 or 0)

IO

1. cin and cout: reads and writes data 
2. getline: reads a whole line of data 
3. printf and scanf: C-style input/output; useful when the number of variables or the type of variables is not known 
4. stringstream: adds C++ style syntax to C-style input/output (C++ only)
5. ifstream and ofstream: reads and writes data from/to files (C++ only)
6. fread, fwrite: reads and writes binary files (C only)
7. fopen, fclose, fscanf, fprintf: file operations; use for text files (C only)
8. freopen: redirects one stream to another (C only) 
9. getchar, putchar: reads/writes a single character 


Iterators and ranges


1. begin(container): returns an iterator pointing to the first element in a container
    Example usage:
              for (auto it = begin(container); it != end(container); it++)
               // This will iterate through all the elements in the container
2. end(container): returns an iterator pointing to one element past the last element in a container
3. rbegin(container): returns a reverse iterator pointing to the last element in a container
4. rend(container): returns a reverse iterator pointing to one element before the first element in a container
5. size(container): returns the size of a container
6. empty(container): returns true if the container is empty, false otherwise
7. back(container): returns a reference to the last element in the container
8. front(container): returns a reference to the first element in the container
9. push_back(container, element): adds an element to the end of the container 
10. pop_back(container): removes the last element from the container

Vectors


	1. vector<T>: a sequence of variables in memory that can be accessed by their position in the sequence (like an array). Efficiency: O(1) random access, O(logN) insertion and deletion.
	2. vector<bool>: a special data type that is more efficient than using a vector<int> for storing booleans. Efficiency: O(1) access and modification.
	3. vector<T>::iterator: the type of an iterator for a vector<T>.


Sets


1. set<T>: a container that stores unique elements in sorted order. Efficiency: O(logN) insertion and deletion, O(logN) search.
2. multiset<T>: a container that stores elements in sorted order. Efficiency: O(logN) insertion and deletion, O(logN) search.
3. set<T>::iterator: the type of an iterator for a set<T>.
//Vector methods with efficiency.
1. set<T>::erase(position): removes the element pointed to by position from the set. Efficiency: O(logN).
2. set<T>::erase(first, last): removes all elements in the range [first, last). Efficiency: O(logN + N), where N is the number of elements in the range.
3. set<T>::find(element): searches for an element in the set, and returns an iterator pointing to that element if it is found. Efficiency: O(logN).
4. set<T>::count(element): returns the number of copies of element in the set. Efficiency: O(logN).
5. set<T>::lower_bound(element): returns an iterator pointing to the first element in the set that is not less than element. Efficiency: O(logN).
6. set<T>::upper_bound(element): returns an iterator pointing to the first element in the set that is greater than element. Efficiency: O(logN).
7. set<T>::equal_range(element): returns a pair of iterators pointing to the first and one element past the last element in the set that is equal to element. Efficiency: O(logN).

Maps

	
	1. map<T1, T2>: a container that stores key-value pairs in sorted order. Efficiency: O(logN) insertion and deletion, O(logN) search.
	2. multimap<T1, T2>: a container that stores key-value pairs in sorted order. Efficiency: O(logN) insertion and deletion, O(logN) search.
	3. map<T1, T2>::iterator: the type of an iterator for a map<T1, T2>.
	4. map<T1, T2>::value_type: a data type that is a pair<const T1, T2>.


Unordered sets and maps


1. unordered_set<T>: a container that stores unique elements in an unordered fashion. Efficiency: O(1) insertion and deletion, O(1) search.
2. unordered_multiset<T>: a container that stores elements in an unordered fashion. Efficiency: O(1) insertion and deletion, O(1) search.
3. unordered_set<T>::iterator: the type of an iterator for a unordered_set<T>.
4. unordered_set<T>::value_type: a data type that is a pair<const T1, T2>.

Bitsets


1. bitset<N>: a data type that allows bitwise operations on 0 to N-1, inclusive.
2. bitset<N>::count(): returns the number of 1's in the bitset.
3. bitset<N>::flip(): flips all bits in the bitset.
4. bitset<N>::reset(): sets all bits in the bitset to 0.
5. bitset<N>::set(): sets all bits in the bitset to 1.
6. bitset<N>::set(position, value): sets the bit at position to value.
7. bitset<N>::test(position): returns the value of the bit at position.


Stack and queue


1. stack<T>: a container that stores data in a LIFO (Last In First Out) order.
2. queue<T>: a container that stores data in a FIFO (First In First Out) order.
3. priority_queue<T>: a container that stores data in a priority order.

Heap


1. priority_queue<T> (by default max heap): a container that stores data in a priority order. The largest element is placed at the top of the queue. Efficiency: O(logN) insertion, O(1) deletion.
2. priority_queue<T, vector<T>, greater<T>> (min heap): a container that stores data in a priority order. The smallest element is placed at the top of the queue. Efficiency: O(logN) insertion, O(1) deletion.
3. make_heap(first, last, comparison): transforms the range [first, last) into a heap using comparison. Efficiency: O(N).
4. pop_heap(first, last, comparison): transforms the range [first, last) into a heap using comparison, and removes the first element in the heap. Efficiency: O(logN).
5. push_heap(first, last, comparison): transforms the range [first, last) into a heap using comparison, and adds the element last - 1 to the heap. Efficiency: O(logN).
6. sort_heap(first, last, comparison): transforms the range [first, last) into a heap using comparison, and sorts the elements in the range in ascending order. Efficiency: O(N logN).
7. is_heap(first, last, comparison): returns true if the range [first, last) is a heap using comparison, false otherwise. Efficiency: O(N).


Priority queue


	1. priority_queue<T>: a container that stores data in a priority order. The largest element is placed at the top of the queue. Efficiency: O(logN) insertion, O(1) deletion.
	2. priority_queue<T, vector<T>, greater<T>>: a container that stores data in a priority order. The smallest element is placed at the top of the queue. Efficiency: O(logN) insertion, O(1) deletion.

Sorting algorithms


1. sort(first, last, comparison): sorts the range [first, last) using comparison. Efficiency: O(N logN).
2. stable_sort(first, last, comparison): sorts the range [first, last) using comparison. The relative order of equivalent elements is maintained. Efficiency: O(N logN).
3. partial_sort(first, middle, last, comparison): sorts the range [first, last) using comparison so that elements in the range [first, middle) are less than or equal to the elements in the range [middle, last). Efficiency: O(N logN).
4. partial_sort_copy(first, last, resultFirst, resultLast, comparison): copies the range [first, last) to the range [resultFirst, resultLast) using comparison so that elements in the range [resultFirst, resultLast) are less than or equal to the elements in the range [first, last). Efficiency: O(N logN).
5. is_sorted(first, last, comparison): returns true if the range [first, last) is sorted using comparison, false otherwise. Efficiency: O(N).
6. is_sorted_until(first, last, comparison): returns an iterator pointing to the first element in the range [first, last) that is not sorted using comparison. Efficiency: O(N).


Search algorithms


	1. binary_search(first, last, value, comparison): returns true if value exists in the range [first, last), false otherwise. Efficiency: O(logN). 
	2. lower_bound(first, last, value, comparison): returns an iterator pointing to the first element in the range [first, last) that has a value not less than value. Efficiency: O(logN).
	3. upper_bound(first, last, value, comparison): returns an iterator pointing to the first element in the range [first, last) that has a value greater than value. Efficiency: O(logN).
	4. equal_range(first, last, value, comparison): returns a pair of iterators pointing to the first and one element past the last element in the range [first, last) that is equal to value. Efficiency: O(logN).


String operations


1. string: a data type that is a sequence of characters in memory. 
2. string::iterator: the type of an iterator for a string.
3. string::length(): returns the number of characters in the string.
4. string::empty(): returns true if the string is empty, false otherwise.
5. string::append(): appends a string to the end of the current string.
6. string::swap(): swaps the contents of two strings.
7. string::find(): searches for a string inside the current string, and returns the starting position if found.
8. string::rfind(): searches for a string inside the current string, and returns the starting position of the last occurrence if found.
9. string::replace(): replaces a part of the current string with another string.
10. string::substr(): returns a part of the current string.
11. string::insert(): inserts a string into the current string.
12. string::erase(): removes a part of the current string.
13. string::resize(): changes the size of the current string.
14. string::capacity(): returns the maximum size of the string.
15. string::reserve(): reserves storage for the string.
16. string::c_str(): returns a C-style string.
17. string::copy(): copies a part of the current string to a C-style string.
18. string::compare(): compares two strings.


Number theory


1. __builtin_popcount(x): returns the number of 1's in the binary representation of x.
2. __builtin_clz(x): returns the number of leading 0's in the binary representation of x.
3. __builtin_ctz(x): returns the number of trailing 0's in the binary representation of x.
4. gcd(a, b): returns the greatest common divisor of a and b using Euclid's algorithm.
5. lcm(a, b): returns the least common multiple of a and b.
6. pow(a, b): returns a raised to the power of b. 
7. isPrime(n): returns true if n is a prime number, false otherwise.
8. sieveOfEratosthenes(n): generates all prime numbers in the range [0, n) (inclusive).
9. eulerTotient(n): returns the number of positive integers less than n that are relatively prime to n.

Geometry


1. abs(x): returns the absolute value of x.
2. max(x, y): returns the maximum of x and y.
3. min(x, y): returns the minimum of x and y.
4. sqrt(x): returns the square root of x.
5. pow(x, y): returns x raised to the power of y.
6. floor(x): returns the largest integer not greater than x.
7. ceil(x): returns the smallest integer not less than x.
8. round(x): returns the integer closest to x.
9. long long int my_round(double x): returns the integer closest to x.
10. double my_round_double(double x): returns the double closest to x.
11. double to_double(int x): converts an int to a double.
12. double to_double(long long int x): converts a long long int to a double.
13. long long int to_llint(int x): converts an int to a long long int.
14. long long int to_llint(double x): converts a double to a long long int.
15. ld my_sqrt(double x): returns the square root of x as a long double.
16. ld my_pow(double x, double y): returns x raised to the power of y as a long double.
17. double my_pow_double(double x, double y): returns x raised to the power of y as a double.
18. long double my_abs(double x): returns the absolute value of x as a long double.
19. double my_abs_double(double x): returns the absolute value of x as a double.
20. double my_acos(double x): returns the arc cosine of x as a double.
21. long double my_acos(double x): returns the arc cosine of x as a long double.

## Graph theory

```cpp

1. adjList: use an adjacency list to represent a graph as an array of linked lists.
2. adjList<T> graph: creates a graph with T as the node type.
3. graph.nodeCount: the number of nodes in the graph.
4. graph.edgeCount: the number of edges in the graph.
5. graph.nodes: a vector containing all the nodes in the graph.
6. graph.edges: a vector containing all the edges in the graph.
7. graph. neighbourList: an array of linked lists containing the neighbours of each node.
8. graph.index: an array containing the indices of the nodes in the graph.
9. graph. deg: an array containing the degree of each node.
10. graph. addNode(u): adds a node u to the graph.
11. graph. addEdge(u, v): adds an edge from node u to node v with weight 1.
12. graph. addEdge(u, v, weight): adds an edge from node u to node v with weight weight.
13. graph. removeNode(u): removes a node u from the graph.
14. graph. removeEdge(u, v): removes an edge from node u to node v.
15. graph. clear(): clears the graph.
16. graph. getNodeIndex(u): returns the index of node u.
17. graph. getNodeDegree(u): returns the degree of node u.
18. graph. getNodeCount(): returns the number of nodes in the graph.
19. graph. getEdgeCount(): returns the number of edges in the graph.
20. graph. isNode(u): returns true if node u exists in the graph, false otherwise.
21. graph. isEdge(u, v): returns true if there is an edge from node u to node v, false otherwise.


Dynamic programming


1. dp: use a two-dimensional array to represent a table in dynamic programming.
2. dp<T> table: creates a table with T as the data type.
3. table.rowCount: the number of rows in the table.
4. table.columnCount: the number of columns in the table.
5. table.table: a two-dimensional array containing the data in the table.
6. table. clear(): clears the table.
7. table. resize(rowCount, columnCount): resizes the table.

Computational geometry


1. point: a data type for points in two-dimensional space.
2. point p(x, y): creates a point at coordinates (x, y).
3. point p = (x, y): creates a point at coordinates (x, y).
4. point p1 = p2: creates a point p1 with the same coordinates as p2.
5. p.x: the x-coordinate of point p.
6. p.y: the y-coordinate of point p.
7. p1 == p2: returns true if points p1 and p2 have the same coordinates, false otherwise.
8. p1 != p2: returns true if points p1 and p2 have different coordinates, false otherwise.
9. p1 < p2: returns true if the x-coordinate of p1 is less than the x-coordinate of p2, or if the x-coordinates are equal and the y-coordinate of p1 is less than the y-coordinate of p2, false otherwise.
10. p1 > p2: returns true if the x-coordinate of p1 is greater than the x-coordinate of p2, or if the x-coordinates are equal and the y-coordinate of p1 is greater than the y-coordinate of p2, false otherwise.
11. p1 <= p2: returns true if the x-coordinate of p1 is less than or equal to the x-coordinate of p2, or if the x-coordinates are equal and the y-coordinate of p1 is less than or equal to the y-coordinate of p2, false otherwise.
12. p1 >= p2: returns true if the x-coordinate of p1 is greater than or equal to the x-coordinate of p2, or if the x-coordinates are equal and the y-coordinate of p1 is greater than or equal to the y-coordinate of p2, false otherwise.
13. point::operator+(point p): returns the point obtained by adding point p to the current point.
14. point::operator-(point p): returns the point obtained by subtracting point p from the current point.
15. point::operator*(double k): returns the point obtained by multiplying the current point by a scalar k.
16. point::operator/(double k): returns the point obtained by dividing the current point by a scalar k.
17. point::operator+=(point p): adds point p to the current point and returns the result.
18. point::operator-=(point p): subtracts point p from the current point and returns the result.
19. point::operator*=(double k): multiplies the current point by a scalar k and returns the result.
20. point::operator/=(double k): divides the current point by a scalar k and returns the result.
21. point::operator-(): returns the opposite of the current point.
22. point::length(): returns the length of the current point.
23. point::distance(point p): returns the distance between the current point and point p.
24. point::squaredDistance(point p): returns the squared distance between the current point and point p.
25. point::dot(point p): returns the dot product of the current point and point p.
26. point::cross(point p): returns the cross product of the current point and point p.
27. point::perpendicular(): returns a point perpendicular to the current point.
28. point::rotate(double angle, point p): rotates the current point counterclockwise by the specified angle around point p.
29. point::normalized(): returns the normalized version of the current point.
30. point::angle(point p): returns the angle between the current point and point p.
31. point::direction(point p): returns a point with the same direction as the current point, but with length 1.

Graph theory


1. dijkstra(source, target, graph): runs Dijkstra's algorithm on graph, starting at vertex source and going to vertex target. Returns the shortest path to target and the shortest path length. Efficiency: O(E logV).
2. floydWarshall(graph): runs the Floyd-Warshall algorithm on graph. Returns a matrix of shortest paths and a matrix of shortest path lengths. Efficiency: O(V^3).
3. bellmanFord(source, target, graph): runs the Bellman-Ford algorithm on graph, starting at vertex source and going to vertex target. Returns the shortest path to target and the shortest path length. Efficiency: O(VE).
4. dijkstraAll(graph): runs Dijkstra's algorithm on graph, starting at all vertices. Returns a matrix of shortest paths and a matrix of shortest path lengths. Efficiency: O(E logV + V^2).
5. floydWarshallAll(graph): runs the Floyd-Warshall algorithm on graph. Returns a matrix of shortest paths and a matrix of shortest path lengths. Efficiency: O(V^3).
6. bellmanFordAll(graph): runs the Bellman-Ford algorithm on graph, starting at all vertices. Returns a matrix of shortest paths and a matrix of shortest path lengths. Efficiency: O(VE).
7. minCostFlow(graph, capacity, cost, source, target): runs the min-cost max-flow algorithm on graph, with the specified capacity and cost functions and a source and target. Returns the max flow and the cost of the flow. Efficiency: O(F E logV), where F is the max flow.
8. fordFulkerson(graph, capacity, source, target): runs the Ford-Fulkerson algorithm on graph, with the specified capacity function and a source and target. Returns the max flow. Efficiency: O(F E), where F is the max flow.
9. fordFulkersonBinarySearch(graph, capacity, source, target): runs the Ford-Fulkerson algorithm on graph, with the specified capacity function and a source and target. Returns the max flow. Efficiency: O(E^2 V log(CV)), where C is the sum of the capacities on the edges, and V is the number of vertices.
10. johnson(graph): runs the Johnson algorithm on graph. Returns a matrix of shortest paths and a matrix of shortest path lengths. Efficiency: O(VE + V^2 logV).
11. topologicalSort(graph): sorts the vertices of graph topologically. Returns an array of vertices. Efficiency: O(V + E).
12. kosarajuSSC(graph): runs the Kosaraju algorithm on graph. Returns an array of the vertices in each strongly-connected component, in topological order. Efficiency: O(V + E).
13. tarjanSSC(graph): runs the Tarjan algorithm on graph. Returns an array of the vertices in each strongly-connected component, in topological order. Efficiency: O(V + E).
14. biconnectedComponents(graph): runs Tarjan's algorithm on graph. Returns an array of pairs of vertices, each of which is a cut vertex and the other is an articulation point. Efficiency: O(V + E).
15. biconnectedComponentsBridges(graph): runs Tarjan's algorithm on graph. Returns an array of pairs of vertices, each of which is a bridge and the other is an articulation point. Efficiency: O(V + E).
16. cycle(graph): returns true if graph contains a cycle, false otherwise. Efficiency: O(V + E).
17. cycle(graph, source): returns true if graph contains a cycle, starting at source. Efficiency: O(V + E).
18. cycle(graph, source, target): returns true if graph contains a path from source to target that forms a cycle, false otherwise. Efficiency: O(V + E).
19. eulerCycle(graph): returns an Euler cycle in graph, if one exists. Efficiency: O(E).
20. eulerPath(graph): returns an Euler path in graph, if one exists. Efficiency: O(E).
21. bipartite(graph): returns true if graph is bipartite, false otherwise. Efficiency: O(V + E).
22. twoColor(graph): returns true if graph is bipartite, false otherwise. Efficiency: O(V + E).
23. minCut(graph, source, target): returns a minimum cut in graph, with a source and target. Efficiency: O(E V^2).
24. minCut(graph): returns a minimum cut in graph. Efficiency: O(V^3).
25. minCutBipartiteMatching(graph, source, target): returns a minimum cut in graph, with a source and target. Efficiency: O(V^2), assuming the graph is bipartite.
26. minCutBipartiteMatching(graph): returns a minimum cut in graph. Efficiency: O(V^2), assuming the graph is bipartite.
27. stronglyConnectedComponents(graph): runs the Tarjan algorithm on graph. Returns an array of the vertices in each strongly-connected component, in topological order. Efficiency: O(V + E).
28. articulationPoints(graph): runs Tarjan's algorithm on graph. Returns an array of the articulation points in graph. Efficiency: O(V + E).
29. bridges(graph): runs Tarjan's algorithm on graph. Returns an array of the bridges in graph. Efficiency: O(V + E).
30. biconnectedComponents(graph): runs Tarjan's algorithm on graph. Returns an array of pairs of vertices, each of which is a cut vertex and the other is an articulation point. Efficiency: O(V + E).
31. biconnectedComponentsBridges(graph): runs Tarjan's algorithm on graph. Returns an array of pairs of vertices, each of which is a bridge and the other is an articulation point. Efficiency: O(V + E).
32. cycle(graph): returns true if graph contains a cycle, false otherwise. Efficiency: O(V + E).

Data structures


1. Binary search tree: a container that stores data in a binary tree. Each node stores an element and has two children, a left child and a right child. The left child is less than or equal to the node, and the right child is greater than the node. Efficiency: O(logN) insertion, deletion, and search.
Operations:
Instantiation: BinarySearchTree<int> tree;
Insert: tree.insert(5);
Delete: tree.delete(5);
Search: if (tree.search(5)) { // 5 is in the tree }

2. Fenwick tree: a container that stores data in an array and allows quick updates and range queries on the data. Efficiency: O(logN) updates and range queries.
Operations:
Instantiation: FenwickTree<int> ft(100);
Update: ft.update(5, 1);
Range query: ft.query(5, 10);

3. Union-find: a container that stores data in an array and keeps track of connected components. Efficiency: O(logN) for union and find.
Operations:
Instantiation: UnionFind uf(100);
Union: uf.union(5, 6);
Find: uf.find(5);

4. Segment tree: a container that stores data in an array and allows quick updates and range queries on the data. Efficiency: O(logN) for updates and range queries.
Operations:
Instantiation: SegmentTree<int> st(a, 0, a.size() - 1);
Update: st.update(5, 1);
Range query: st.query(5, 10);

5. Sparse table: a container that stores data in an array and allows quick updates and range queries on the data. Efficiency: O(logN) for updates and range queries.
Operations:
Instantiation: SparseTable<int> st(a);
Update: st.update(5, 1);
Range query: st.query(5, 10);