From 16333df0a038105a960f8e4f9007aa702d0cf237 Mon Sep 17 00:00:00 2001
From: Louis1992 <303542123@qq.com>
Date: Thu, 9 Jul 2015 17:28:40 +0800
Subject: [PATCH] CLRS C10
---
C10-Elementary-Data-Structures/10.1.md | 120 ++++++++++++++
C10-Elementary-Data-Structures/10.2.md | 72 +++++++++
C10-Elementary-Data-Structures/10.3.md | 80 ++++++++++
C10-Elementary-Data-Structures/10.4.md | 151 ++++++++++++++++++
C10-Elementary-Data-Structures/README.md | 1 +
.../exercise_code/af-obj.c | 88 ++++++++++
.../exercise_code/deque.py | 48 ++++++
.../exercise_code/dict.cpp | 84 ++++++++++
C10-Elementary-Data-Structures/problem.md | 80 ++++++++++
C10-Elementary-Data-Structures/repo/s4/1.png | Bin 0 -> 20347 bytes
README.md | 11 ++
11 files changed, 735 insertions(+)
create mode 100644 C10-Elementary-Data-Structures/10.1.md
create mode 100644 C10-Elementary-Data-Structures/10.2.md
create mode 100644 C10-Elementary-Data-Structures/10.3.md
create mode 100644 C10-Elementary-Data-Structures/10.4.md
create mode 100644 C10-Elementary-Data-Structures/README.md
create mode 100644 C10-Elementary-Data-Structures/exercise_code/af-obj.c
create mode 100644 C10-Elementary-Data-Structures/exercise_code/deque.py
create mode 100644 C10-Elementary-Data-Structures/exercise_code/dict.cpp
create mode 100644 C10-Elementary-Data-Structures/problem.md
create mode 100644 C10-Elementary-Data-Structures/repo/s4/1.png
diff --git a/C10-Elementary-Data-Structures/10.1.md b/C10-Elementary-Data-Structures/10.1.md
new file mode 100644
index 00000000..24cef3d7
--- /dev/null
+++ b/C10-Elementary-Data-Structures/10.1.md
@@ -0,0 +1,120 @@
+### Exercises 10.1-1
+***
+Using Figure 10.1 as a model, illustrate the result of each operation in the sequence PUSH(S, 4), PUSH(S, 1), PUSH(S, 3), POP(S), PUSH(S, 8), and POP(S) on an initially empty stack S stored in array S[1...6].
+
+### `Answer`
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 |
+
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 | 1 |
+
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 | 1 |3
+
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 | 1
+
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 | 1 | 8
+
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 | 1
+
+
+### Exercises 10.1-2
+***
+Explain how to implement two stacks in one array A[1...n] in such a way that neither stack overflows unless the total number of elements in both stacks together is n. The PUSH and POP operations should run in O(1) time.
+
+### `Answer`
+分别从两头开始做就行了
+
+### Exercises 10.1-3
+***
+Using Figure 10.2 as a model, illustrate the result of each operation in the sequence ENQUEUE(Q, 4), ENQUEUE(Q, 1), ENQUEUE(Q, 3), DEQUEUE(Q), ENQUEUE(Q, 8), and DEQUEUE(Q) on an initially empty queue Q stored in array Q[1...6].
+
+### `Answer`
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 |
+
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 | 1 |
+
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+4 | 1 | 3
+
+1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+ | 1 | 3
+
+ 1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+ | 1 | 3 | 8
+
+ 1 |2| 3 |4 |5 |6|
+:---:|:---:|:---:|:---:|:---:|:---:
+ | | 3 |8
+
+### Exercises 10.1-4
+***
+Rewrite ENQUEUE and DEQUEUE to detect underflow and overflow of a queue.
+
+### `Answer`
+在开头加上
+
+ ENQUEUE(Q, x):
+ if head[Q] == tail[Q] + 1
+ then error "overflow"
+ ......
+
+ DEQUEUE(Q):
+ if head[Q] == tail[Q]
+ then error "underflow"
+ ......
+
+
+### Exercises 10.1-5
+***
+Whereas a stack allows insertion and deletion of elements at only one end, and a queue allows insertion at one end and deletion at the other end, a deque (double-ended queue) allows insertion and deletion at both ends. Write four O(1)-time procedures to insert elements into and delete elements from both ends of a deque constructed from an array.
+
+### `Answer`
+我没有检查overflow和underflow,用N去判断就可以了.
+
+[implementation](./exercise_code/deque.py)
+
+### Exercises 10.1-6
+***
+Show how to implement a queue using two stacks. Analyze the running time of the queue operations.
+
+### `Answer`
+这个题目有出现在[leetcode](https://leetcode.com/problems/implement-stack-using-queues/),这是我的[solution](https://github.com/gzc/leetcode/blob/master/cpp/221-230/Implement%20Stack%20using%20Queues.cpp)
+
+* push操作是O(1)的
+* empty操作是O(1)的
+* top操作是O(1)的
+* 但是pop操作最坏需要O(n)
+
+### Exercises 10.1-7
+***
+Show how to implement a stack using two queues. Analyze the running time of the stack operations.
+
+### `Answer`
+这个题目也出现在[leetcode](https://leetcode.com/problems/implement-queue-using-stacks/)
+
+[my solution](https://github.com/gzc/leetcode/blob/master/cpp/231-240/Implement%20Queue%20using%20Stacks.cpp)
+
+最坏情况pop需要O(n),但是pop的平均情况只需要O(1)
+
+
+***
+Follow [@louis1992](https://github.com/gzc) on github to help finish this task.
+
diff --git a/C10-Elementary-Data-Structures/10.2.md b/C10-Elementary-Data-Structures/10.2.md
new file mode 100644
index 00000000..c88eec17
--- /dev/null
+++ b/C10-Elementary-Data-Structures/10.2.md
@@ -0,0 +1,72 @@
+### Exercises 10.2-1
+***
+Can the dynamic-set operation INSERT be implemented on a singly linked list in O(1) time? How about DELETE?
+
+### `Answer`
+插入的话可以直接插入在开头,删除的话需要遍历.
+
+
+### Exercises 10.2-2
+***
+Implement a stack using a singly linked list L. The operations PUSH and POP should still
take O(1) time.
+
+### `Answer`
+PUSH插入到链表头,POP从链表头操作,都是O(1)的.
+
+### Exercises 10.2-3
+***
+Implement a queue by a singly linked list L. The operations ENQUEUE and DEQUEUE
should still take O(1) time.
+
+### `Answer`
+
+* ENQUEUE插入到链表尾
+* DEQUEUE从链表头取出
+
+### Exercises 10.2-4
+***
+As written, each loop iteration in the LIST-SEARC′ procedure requires two tests: one for x ≠
nil[L] and one for key[x] ≠ k. Show how to eliminate the test for x ≠ nil[L] in each iteration.
+
+### `Answer`
+
+ LIST-SEARC′(L, k):
+ key[nil[L]] = k
+ x ← next[nil[L]]
+ while(key[x] != k):
+ x ← next[x]
+ if x == nil[L]:
+ return NULL
+ return x
+
+
+### Exercises 10.2-5
+***
+Implement the dictionary operations INSERT, DELETE, and SEARCH using singly linked, circular lists. What are the running times of your procedures?
+
+### `Answer`
+[implementation](./exercise_code/dict.cpp)
+
+### Exercises 10.2-6
+***
+The dynamic-set operation UNION takes two disjoint sets S1 and S2 as input, and it returns a set S = S1 U S2 consisting of all the elements of S1 and S2. The sets S1 and S2 are usually destroyed by the operation. Show how to support UNION in O(1) time using a suitable list data structure.
+
+### `Answer`
+如果用链表实现,可以将第二个list连接到第一个list上.
+
+### Exercises 10.2-7
+***
+Give a Θ(n)-time nonrecursive procedure that reverses a singly linked list of n elements. The procedure should use no more than constant storage beyond that needed for the list itself.
+
+### `Answer`
+[solution](https://github.com/gzc/leetcode/blob/master/cpp/201-210/Reverse%20Linked%20List.cpp)
+
+### Exercises 10.2-8
+***
+Explain how to implement doubly linked lists using only one pointer value np[x] per item instead of the usual two (next and prev). Assume that all pointer values can be interpreted as k-bit integers, and define np[x] to be np[x] = next[x] XOR prev[x], the k-bit "exclusive-or" of next[x] and prev[x]. (The value NIL is represented by 0.) Be sure to describe what information is needed to access the head of the list. Show how to implement the SEARCH, INSERT, and DELETE operations on such a list. Also show how to reverse such a list in O(1) time.
+
+### `Answer`
+为了访问下一个元素,只需要XOR(np,prev).为了访问前一个元素,只需要XOR(np,next).
+
+
+***
+Follow [@louis1992](https://github.com/gzc) on github to help finish this task.
+
diff --git a/C10-Elementary-Data-Structures/10.3.md b/C10-Elementary-Data-Structures/10.3.md
new file mode 100644
index 00000000..3cb6fb1c
--- /dev/null
+++ b/C10-Elementary-Data-Structures/10.3.md
@@ -0,0 +1,80 @@
+### Exercises 10.3-1
+***
+Draw a picture of the sequence[13, 4, 8, 19, 5, 11]stored as a doubly linked list using the multiple-array representation. Do the same for the single-array representation.
+
+### `Answer`
+
+---+
+| L |-------------------------------------------+
++---+ V
+ 1 2 3 4 5 6 7 8 9 10 11 12
+ +----+----+----+----+----+----+----+----+----+----+----+----+
+next | | | 5 | 7 | 10 | | / | | 3 | 4 | | |
+ +----+----+----+----+----+----+----+----+----+----+----+----+
+ key | | | 4 | 5 | 8 | | 11 | | 13 | 19 | | |
+ +----+----+----+----+----+----+----+----+----+----+----+----+
+prev | | | 8 | 10 | 2 | | 4 | | / | 5 | | |
+ +----+----+----+----+----+----+----+----+----+----+----+----+
+
+
+
++----+----+----+
+| key|next|prev|
++----+----+----+
+
+13 is head.
+
+ 1 2 3 4 5 6 7 8 9 10 11 12
++----+----+----++----+----+----++----+----+----++----+----+----++--
+| 4 | 7 | 13 || 5 | 10 | 16 || 8 | 16 | 1 || 11 | / | 4 ||
++----+----+----++----+----+----++----+----+----++----+----+----++--
+
+ 13 14 15 16 17 18
+ --++----+----+----++----+----+----+
+ || 13 | 1 | / || 19 | 4 | 7 |
+ --++----+----+----++----+----+----+
+
+
+
+
+### Exercises 10.3-2
+***
+Write the procedures ALLOCATE-OBJECT and FREE-OBJECT for a homogeneous collection of objects implemented by the single-array representation.
+
+### `Answer`
+[implementation](./exercise_code/af-obj.c)
+
+### Exercises 10.3-3
+***
+Why don't we need to set or reset the prev fields of objects in the implementation of the ALLOCATE-OBJECT and FREE-OBJECT procedures?
+
+### `Answer`
+
+因为这类似于一个栈,没有prev.
+
+### Exercises 10.3-4
+***
+It is often desirable to keep all elements of a doubly linked list compact in storage, using, for example, the first m index locations in the multiple-array representation. (This is the case in a paged, virtual-memory computing environment.) Explain how the procedures ALLOCATE>- OBJECT and FREE-OBJECT can be implemented so that the representation is compact. Assume that there are no pointers to elements of the linked list outside the list itself. (Hint: Use the array implementation of a stack.)
+
+### `Answer`
+
+* ALLOCATE:选free_list的head.
+* FREE-OBJECT:不是直接变成head,而是按sorted的方式插入.
+
+这样可以保证每次分配的时候取排在最前面的空位置
+
+
+
+### Exercises 10.3-5
+***
+Let L be a doubly linked list of length m stored in arrays key, prev, and next of length n. Suppose that these arrays are managed by ALLOCATE-OBJECT and FREE-OBJECT procedures that keep a doubly linked free list F. Suppose further that of the n items, exactly m are on list L and n-m are on the free list. Write a procedure COMPACTIFY-LIST(L, F) that, given the list L and the free list F, moves the items in L so that they occupy array positions 1, 2,..., m and adjusts the free list F so that it remains correct, occupying array positions m + 1, m + 2,..., n. The running time of your procedure should be Θ(n), and it should use only a constant amount of extra space. Give a careful argument for the correctness of your procedure.
+
+### `Answer`
+
+* 先遍历free_list,给每个item的prev标记一下,用来区别L中的item.
+* 两根指针,一根p1在array的头,另一个p2在尾巴.p1向右移动知道遇到free item,p2向左移动直到遇到used item,然后交换p1和p2的内容.遍历一直到p1,p2遇到为止.
+* 重新整理free_list中的元素.
+
+
+***
+Follow [@louis1992](https://github.com/gzc) on github to help finish this task.
+
diff --git a/C10-Elementary-Data-Structures/10.4.md b/C10-Elementary-Data-Structures/10.4.md
new file mode 100644
index 00000000..1a68c4c6
--- /dev/null
+++ b/C10-Elementary-Data-Structures/10.4.md
@@ -0,0 +1,151 @@
+### Exercises 10.4-1
+***
+Draw the binary tree rooted at index 6 that is represented by the following fields.
+
+
+
+
+index |
+key |
+left |
+right |
+
+
+
+
+1 |
+12 |
+7 |
+3 |
+
+
+2 |
+15 |
+8 |
+NIL |
+
+
+3 |
+4 |
+10 |
+NIL |
+
+
+4 |
+10 |
+5 |
+9 |
+
+
+5 |
+2 |
+NIL |
+NIL |
+
+
+6 |
+18 |
+1 |
+4 |
+
+
+7 |
+7 |
+NIL |
+NIL |
+
+
+8 |
+14 |
+6 |
+2 |
+
+
+9 |
+21 |
+NIL |
+NIL |
+
+
+10 |
+5 |
+NIL |
+NIL |
+
+
+
+
+### `Answer`
+![](./repo/s4/1.png)
+
+
+
+### Exercises 10.4-2
+***
+Write an O(n)-time recursive procedure that, given an n-node binary tree, prints out the key of each node in the tree.
+
+### `Answer`
+前序,中序和后序遍历.
+
+### Exercises 10.4-3
+***
+Write an O(n)-time nonrecursive procedure that, given an n-node binary tree, prints out the key of each node in the tree. Use a stack as an auxiliary data structure.
+
+### `Answer`
+
+这些题目都出现在leetcode上.
+
+[pre-order](https://leetcode.com/problems/binary-tree-preorder-traversal/) [solution](https://github.com/gzc/leetcode/blob/master/cpp/141-150/Tree%20Preorder%20Traversal.cpp)
+
+[in-order](https://leetcode.com/problems/binary-tree-inorder-traversal/) [solution](https://github.com/gzc/leetcode/blob/master/cpp/091-100/Binary%20Tree%20Inorder%20Traversal.cpp)
+
+[post-order](https://leetcode.com/problems/binary-tree-postorder-traversal/) [solution](https://github.com/gzc/leetcode/blob/master/cpp/141-150/Binary%20Tree%20Postorder%20Traversal.cpp)
+
+### Exercises 10.4-4
+***
+Write an O(n)-time procedure that prints all the keys of an arbitrary rooted tree with n nodes, where the tree is stored using the left-child, right-sibling representation.
+
+### `Answer`
+
+ PROCEDURE(root):
+ if root != NULL
+ PRINT root->key
+ if(root->child)
+ PROCEDURE(root->child)
+ if(root->sibling)
+ PROCEDURE(root->sibling)
+
+
+
+### Exercises 10.4-5
+***
+Write an O(n)-time nonrecursive procedure that, given an n-node binary tree, prints out the key of each node. Use no more than constant extra space outside of the tree itself and do not modify the tree, even temporarily, during the procedure.
+
+### `Answer`
+如果不用stack,那么每个node必须要有parent属性.stack的作用其实是依路径保存parent节点.
+
+ PROCEDURE(root):
+ prev = NULL;
+
+ while root != NULL:
+ if prev == root->parent:
+ print root->key
+ root = root->left ? root->left :
+ root->right ? root->right : root->parent;
+ else if prev == root->left && root->right != NULL:
+ root = root->right;
+ else:
+ root = root->parent;
+ prev = root;
+
+### Exercises 10.4-6
+***
+The left-child, right-sibling representation of an arbitrary rooted tree uses three pointers in each node: left-child, right-sibling, and parent. From any node, its parent can be reached and identified in constant time and all its children can be reached and identified in time linear in the number of children. Show how to use only two pointers and one boolean value in each node so that the parent of a node or all of its children can be reached and identified in time linear in the number of children.
+
+### `Answer`
+很简单,去掉parent指针,新增一个表示是否是最后一个儿子的bool值,如果是最后一个,那么next指向parent,否则next指向下一个兄弟节点.
+
+
+***
+Follow [@louis1992](https://github.com/gzc) on github to help finish this task.
+
diff --git a/C10-Elementary-Data-Structures/README.md b/C10-Elementary-Data-Structures/README.md
new file mode 100644
index 00000000..d4486954
--- /dev/null
+++ b/C10-Elementary-Data-Structures/README.md
@@ -0,0 +1 @@
+Problem 10.2 & 10.3 remain
diff --git a/C10-Elementary-Data-Structures/exercise_code/af-obj.c b/C10-Elementary-Data-Structures/exercise_code/af-obj.c
new file mode 100644
index 00000000..9bb7f4fb
--- /dev/null
+++ b/C10-Elementary-Data-Structures/exercise_code/af-obj.c
@@ -0,0 +1,88 @@
+#include
+#include
+
+#define MAX_SIZE 10
+
+typedef int list_t;
+typedef int obj_t;
+
+int empty_list = -1;
+int cells[MAX_SIZE * 3];
+int free_list;
+
+#define NEXT(i) cells[(i) + 1]
+#define PREV(i) cells[(i) + 2]
+#define KEY(i) cells[i]
+
+void init_storage() {
+ int i;
+ for (i = 0; i < (MAX_SIZE - 1) * 3; i += 3)
+ NEXT(i) = i + 3;
+
+ NEXT(i) = -1;
+ free_list = 0;
+}
+
+list_t allocate_object() {
+ if (free_list == -1) {
+ fprintf(stderr, "Storage depleted\n");
+ exit(1);
+ }
+
+ list_t new = free_list;
+ free_list = NEXT(free_list);
+ return new;
+}
+
+void free_object(list_t list) {
+ NEXT(list) = free_list;
+ free_list = list;
+}
+
+list_t cons(obj_t key, list_t list) {
+ list_t new = allocate_object();
+
+ NEXT(new) = list;
+ PREV(new) = empty_list;
+ KEY(new) = key;
+
+ if (list != empty_list) {
+ PREV(list) = new;
+ }
+
+ return new;
+}
+
+void delete(list_t list) {
+ if (PREV(list) != empty_list) {
+ NEXT(PREV(list)) = NEXT(list);
+ }
+
+ if (NEXT(list) != empty_list) {
+ PREV(NEXT(list)) = PREV(list);
+ }
+
+ free_object(list);
+}
+
+obj_t get(list) {
+ if (list == empty_list) return -1;
+ return KEY(list);
+}
+
+list_t next(list) {
+ if (list == empty_list) return -1;
+ return NEXT(list);
+}
+
+int main()
+{
+ init_storage();
+ list_t new_list = cons(5, empty_list);
+ new_list = cons(4, new_list);
+ printf("%d\n", get(new_list));
+ printf("%d\n", get(next(new_list)));
+ delete(new_list);
+
+ return 0;
+}
diff --git a/C10-Elementary-Data-Structures/exercise_code/deque.py b/C10-Elementary-Data-Structures/exercise_code/deque.py
new file mode 100644
index 00000000..436d320e
--- /dev/null
+++ b/C10-Elementary-Data-Structures/exercise_code/deque.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+class Deque:
+
+ def __init__(self, size):
+ self.N = 0
+ self.head = 0
+ self.tail = size-1
+ self.array = [0]*size
+ self.size = size
+
+ def addFirst(self, item):
+ self.array[self.head] = item
+ self.N += 1
+ self.head = (self.head+1)%self.size
+
+ def addLast(self, item):
+ self.array[self.tail] = item
+ self.N += 1
+ self.tail = (self.tail-1)%self.size
+
+ def removeFirst(self):
+ self.N -= 1
+ self.head = (self.head-1)%self.size
+ v = self.array[self.head]
+ return v
+
+ def removeLast(self):
+ self.N -= 1
+ self.tail = (self.tail+1)%self.size
+ v = self.array[self.tail]
+ return v
+
+ def seeAll(self):
+ print self.head,self.tail,self.N
+ print self.array
+
+myqueue = Deque(10)
+myqueue.addFirst(2)
+myqueue.addFirst(3)
+myqueue.addFirst(4)
+myqueue.addLast(5)
+myqueue.addLast(6)
+myqueue.addLast(6)
+myqueue.seeAll()
+print myqueue.removeLast()
+print myqueue.removeFirst()
\ No newline at end of file
diff --git a/C10-Elementary-Data-Structures/exercise_code/dict.cpp b/C10-Elementary-Data-Structures/exercise_code/dict.cpp
new file mode 100644
index 00000000..d401c39b
--- /dev/null
+++ b/C10-Elementary-Data-Structures/exercise_code/dict.cpp
@@ -0,0 +1,84 @@
+/*************************************************************************
+ > File Name: dict.cpp
+ > Author: Louis1992
+ > Mail: zhenchaogan@gmail.com
+ > Blog: http://gzc.github.io
+ > Created Time: Tue Jul 7 21:43:43 2015
+ ************************************************************************/
+#include
+using namespace std;
+
+
+struct node_t {
+ int key;
+ struct node_t *next;
+};
+
+struct list_t{
+ struct node_t nil;
+};
+
+void init_list(list_t *list) {
+ list->nil.key = 0;
+ list->nil.next = &(list->nil);
+}
+
+void destroy_list(list_t *list) {
+ node_t *node = list->nil.next;
+ node_t *next;
+
+ while (node != &(list->nil)) {
+ next = node->next;
+ free(node);
+ node = next;
+ }
+}
+
+void insert(list_t *list, int key) {
+ node_t *newnode = (node_t *) malloc(sizeof(node_t));
+ newnode->key = key;
+ newnode->next = list->nil.next;
+ list->nil.next = newnode;
+}
+
+node_t *search(list_t *list, int key) {
+ node_t *node = list->nil.next;
+ list->nil.key = key;
+
+ while (node->key != key) {
+ node = node->next;
+ }
+
+ if (node == &(list->nil)) {
+ return NULL;
+ } else {
+ return node;
+ }
+}
+
+void del(list_t *list, int key) {
+ node_t *node = &(list->nil);
+
+ while (node->next != &(list->nil)) {
+ if (node->next->key == key) {
+ node_t *to_be_deleted = node->next;
+ node->next = node->next->next;
+ free(to_be_deleted);
+ } else {
+ node = node->next;
+ }
+ }
+}
+
+int main()
+{
+ list_t *mydict = new list_t;
+ init_list(mydict);
+ insert(mydict, 2);
+ insert(mydict, 3);
+ insert(mydict, 4);
+ node_t *tmp = search(mydict, 3);
+ cout << tmp->key;
+
+ return 0;
+}
diff --git a/C10-Elementary-Data-Structures/problem.md b/C10-Elementary-Data-Structures/problem.md
new file mode 100644
index 00000000..be0a2a67
--- /dev/null
+++ b/C10-Elementary-Data-Structures/problem.md
@@ -0,0 +1,80 @@
+### Problems 1 : Comparisons among lists
+***
+For each of the four types of lists in the following table, what is the asymptotic worst-case running time for each dynamic-set operation listed?
+### `Answer`
+
+
+
+ |
+unsorted, singly linked |
+sorted, singly linked |
+unsorted, doubly linked |
+sorted, doubly linked |
+
+
+
+
+SEARCH(L, k) |
+linear |
+linear |
+linear |
+linear |
+
+
+INSERT(L, x) |
+constant |
+linear |
+constant |
+linear |
+
+
+DELETE(L, x) |
+linear |
+linear |
+constant |
+constant |
+
+
+SUCCESSOR(L, x) |
+linear |
+constant |
+linear |
+constant |
+
+
+PREDECESSOR(L, x) |
+linear |
+linear |
+linear |
+constant |
+
+
+MINIMUM(L, k) |
+linear |
+constant |
+linear |
+constant |
+
+
+MAXIMUM(L, k) |
+linear |
+linear |
+linear |
+linear |
+
+
+
+
+### Problems 2 : Mergeable heaps using linked lists
+***
+A **mergeable heap** supports the following operations: MAKE-HEAP (which creates an empty mergeable heap), INSERT, MINIMUM, EXTRACT-MIN, and UNION. Show how to implement mergeable heaps using linked lists in each of the following cases. Try to make each operation as efficient as possible. Analyze the running time of each operation in terms of the size of the dynamic set(s) being operated on.
+
a. Lists are sorted.
+
b. Lists are unsorted.
+
c. Lists are unsorted, and dynamic sets to be merged are disjoint.
+
+### `Answer`
+
+
+***
+Follow [@louis1992](https://github.com/gzc) on github to help finish this task.
+
diff --git a/C10-Elementary-Data-Structures/repo/s4/1.png b/C10-Elementary-Data-Structures/repo/s4/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..03a9dc28ca812bc07815a58d6482a98fa33a38fb
GIT binary patch
literal 20347
zcmZU)1CVAxlP=snZFAbTZQHi}wr%&cZQHhOP209@`_8xb{<|CTSHw9{Co7*sMMXtb
zW}a{bIdM2>ENCDgAUH`05hWlXV7Pz%TF77j-sTH9@IXMYViv-}3X;OY1PYFJrWV!!
zARr02YIQRel@+w@RvAN#5GICSN+H`K7Q)HfU|{7!G_cGd%t;Oy7%G<|agZYc5n$3H
zg+yY}Vgg2jL$(T+Bgl(+c|!*MA>-U`6sCagmz%BT>GqwkXTA?#uN|iuE(n1Qy)uQv
zJuaZPdm@0438bHr7FX^aL|h(}4B{UF3Mv)Q(b3U?pRVmqpeQCimlC5d`PLuX+27L8
zqCgrvOlA=vaZg0K
zjl6diJRB};ERRl^NP)K$-4;)bBR-{Glbmjq3j|gqp2l3l7odMTTV0m44
zCprh528jTa)Fcoz3nD!qsoXLW=P6v_m!Ch*8!CJ(jG{KFLe#7L;ANkN*>@dVdvE$%C}qQ2a7iokTaL|P?yN{kpDymiGU{|X6(;lo+hL*aFz
zrC&@zkK*s~t_k8;fy`(AOi*MXinhOo;8kOls0N~W
zQO$PndkVW=|+$vkS!Kt2ig
zF!HO;o(4_2Z@vze20PK1${PNeRV_x<0K2YQ1MZpG6@%M9dvLvOV-=(d#w*;X4=OAA
z;-I9BmJj@8B=8P{2P!wf>;TLiss}?qq;|0Kj@KR6_gC*9{n3p(Gk1F6AhLd98c4H&
zOi0rGFlVAj1>}b?rhEvLUPsZ=!COp%F_sl4QQDhqD&Q1jB+-UUG~;nD>UXYLO4clL!-
z&d0UK;z!v>pGPuJ>@TG5)P4gD#w?8QD2|Xg#UTnnmD!~sj+u_3Gs89`Yx=PayD2Dh
zHl-Pzks6a5b1Y*mLoUMyi!+Ngi#O{&%Mey0ONy2Ciuqz&(OmxA=saMp{!>%33TIhp
znQK{ZnQ~conOas>R$3N+Dm;T}3M}J-<;5yz$vf{Yr+U=YB(#CNQS}mVnSDw2Z1YS_
zOG~R=O;GJzO;iogV$~vVzP9Q<139&9&I1+sHx7kDa5VfRqYh%RQkw!
zCcU!7g~Qd(R=~}l=El6m7w^^iA^%eQ!UN$2K?p<*Ob1s57l&K-0G&xe
zpPD$JJ;B}G+V#OOI=byJLGB;WK3qtJ2-Y<(Ii!5WBY0cbjK5u1die*v3pljzj
z-?R~BhGvpt+_HX|rkTpQ!qcZ?+Oz)I_NLqe%%7G!sy}MC_o9)eA);AE)1uX+^{Bb7
zNv2KLuxaKo69G7~Nd`2pSFBZxu5WsFJ>gtvUF_JfSa;bJv02$nuXZ&zH_A4DEw^m9
zEKJYRt=A0IEMM1jr}*Ug`1>?}u|jkNwhGq_l7&vhv=#O#o@*Srk3qTJJ1213I9g(h
zVjnR}@l|*(%9^z})j8EWRX+sIboHT45#Z=~8
zaIA>dMAy)7;cSW6s@kq>Hg6Jdo^-Oe_1@aw$GKZSw~_8bkHGZ&W`W`J@bsYKeerbl
z(DVYh+dOuhRo~#=bT58XAxx1Enf1&d<-YXf^oaIAc>g>*Jx@GsT&-{}+g6!eKG(;7
z(tZVhYkzHkyaHna^Mf`)Xn{h5RD$4xYl4Lbx`OgTxk64uZKHhh43UapI#L|kl-Zqb
z&XzC`(J)ofRI%#N^Kg0#zkWeZgk6TMhvi5J9$x+}q0my1SsX9RoGY0tIL$cCanL(B
zjgC4)egcz^II}!HJEo;Xo~4v{&&EpAOw{Z%pC;)A=zL`1z#x_-exJ*z6ELqEUVw)X0HIcQ#vt#+a|Aq@ggnp^@S1YaawpElak_xT+o9pRfWVj>}oyPZ3
z_K>}~I7ZeVxW6x7nVyP#Z3_I1@yHm33Z2UNH%BwZamU8EQ4`L0WwMERfy0WFZW>aiO
zt?TOUIqAyG_wl>lH1sa!9yix@+^ywCYIRBJKvlVM!{p^&t4mFFquJ~}XM#WYYq4&{
z<7U~X%jf9Bu-EcuA(z>=$AREj;6d;v(95s>4RAnso!`J!Wviwu-`&*HO<0|Ob=x*L
z73~`x>WlkzF-?pnUJ-+Zqw5>xVtrTteLyGJG6be3oqFoVN?;rINPbH^!k#w)kBch@8Tx?p!de+RS|*Ye4_y7SPbe6L~VXr!gy
zX0!%WkJEwm^8CzdZiP-K*S`Bo>^@qXoqWf-m$YZegZt(=awpR7rn7OE?#gzJH`^=u
zMfO_#XYY2j$93kp5McmM$2;xycA9vu(993*`>o#i&bWFsS$;Bi(YeC~?=0f9ZlVimhG)qU6fvUAvb=B52S
zeY#civVAk-E%9|*WH%x{GU}3x!^i3y^XA>k-`lHCr~
zCnr4v6Fn0X?LQ7$Cl6a^Lw8zRC*uDrEL5z
zU}xj`FTnqA=zmoHFR14KK-n1>{x|Y}jr>0(5B+~U_+K9V-|6}<>c9EogXW?C@44rL
z{+O-90Rj>Lk`xhCaRd=*h-pJY{*0i=La>06i3uEx
z4PjU?vVgMWm~-V3GBExFlZ{A3<`d@Ki7fn66^=CP&crCD1q=62S_Zs1q)gPGk;HJu
zc_VYkG#1DaQ3BL(F(Zd=Ju^nEDYAn$ho(ql#4wS5=8aA%`e#atDa>(zcedP-2rQ+d_`{}?C6pG@SqLbc6+_=uT+(6W^%8?
z{Pd5`!XA)2wnZ0MaPjd)bCrF?5{dL=(@sahy)Sh2)FXE}nv@X~T>^~vnH5Xl#%4Z@
z@N`*l-lJ;tIz%z~vLK^7cajte88<%9sRHcORAioCJ89zH7Ce#QmIh7KjE}YgcWp%o)
zgDwwp3f6-uK$6bDx{4tY)I)`ore{+^`SuCm^
zg~O!`u|~n(0-l#Dh!c0rC^6z4ACD6^{SE11L1j>JYX7~Z3xAkdjuodV10a@L7EHK5
z?cV}c;y<&Z$zY#6dJSV8e5jDVPjA)owj3t2*fJyWOv#I?04fr`3Yl{JpN3LOtjKJ3
zc6kougJ8|6L<5G`X7tt{5BW;jl$HVUTagS@hr>a0O|Xc2wsasxpsEEsp3P)KcKVz|
zR=gs!k7oDF(u?PBcc1LFKWOmO-4!}X3Bb9E9qd4cEa?hTa&;uEv_66Th_opOXGThY
zB1Hy%-bZm~Zp=OP)1|Otd(`7JxnL?}C>3e;Q;4_N8ht(1UYB;761geUb5lf+>wkQ$
ze(>E|HG*-GTnGjG#a;elxBrDgf3srB9F{+eowEgAzUk6xtju@P0+l`!L9w#J@@?o@
zHknnVgc$<09vH>~i*^Dl)C>S``vhg`9RA#x3e{hAHNkpF4dZXDe_p$aR-625o-Xw<
zBClE!h8{Wm3MIMtn=%LK1rBngXD}hXAC|HlL>aG*`qE2e2~dB;6c8OqC{Az9!bUhF
zpv`>iT;;`c?J^K6?QY)QLIxL&Zm1WKLMRv)9aMPa7JuVGi5l(rxU}+9ypxOsX^tnl
zvwU8*5H|_tLlsLe{gP?Oa{1qkm
zM)Q^)*4t8Qq5lDt48yReyr(bO7-_>OCSJw(3EX7P)9)@C)si#m&4U&h1h$^t^B3l3
zSssEQT;nnL>d9t%ml424ljB)V1b(j^6Gk3Dqde4@5e>l=x_o7&$Qa8vt(4RBPjzJ|$5_ZNEj9PMuNdaLt?~^0;w9Czov*DT;LemvanEBRf)&G+?dcg79vAL(%`3Gje}FkHmNQfsAD9g?`)3{8PpUscH4op%K~ZeQfB`Yah}A$&
zHRr>?YiFamI(jS6?$S!{_iKoM*)~*
zfXf=qgj9ol{re~39DmsY=OlQBjeAjOCpdhIS0^~g5bCpdKuF9lI~y-QN2l-w)fG;}
z-?RjpC6<@cr4!EK7QlbmP;qP}iNfg-yNZ}%zca6%bX8mjj~zt1zVm0}Yy27ar^IqZ
zh~i`X3EnF6B7-oN&8d)t3b?3S2ff#qR$$hHi@n&frrPw{Pa
zpT-bqTs5Z@L=?ePNI5)9z(~=HHCWd7o)W+9)1h}1M)ORib8kkiUgl>)Y~l-zRGd2Y
zXyR&TzIfS3`7Pnco$GIENa&b$IpJkgBrOV
z=2M83&gopQmvfH?nE6-*W5EW787cV{^Qd9twq9cfUTVJr5ob_C@mY5ylU4{$(Knze
znkNYrJQ-ca^No*?`#D92Tv
z2Ev(&4e7TFrQpy%dX}7WHyq0rF36cm7;)g?Qp+#1{?Pm1t}99AJP{J|1Y
z>1&ADg%lCOC6vM;9>k?Pog-hz)Au$-VV0`r=htgpv0+a=@jS&npp#devv1N&-~mo$
z!JPLe%AyESAWA~zpY!Tsq|D~Sh^f-l8|jK5*4@6>G0jcC=Yh{$lG@2emQO0zGvhUF
zc(6W%Do(dxH&g{eat1=Jteyt*YJ)7puD_o*dEBj2BsHSdhE$G~xouP!?1~IqFJ+
zM+=QLWSX#}_as7AOh~5`8MJhTu^P82D?A#f(&gdmXJos6R6xgO)6pZTqz@!s8jrJ#
zHKo)_KY=8RYldV~$#Ry2Ne>r77M7}rt`Pbih;=(?`>fDXk3Tm*gAUYVr%d003+ZkH
z#VN-IaLea&ft@|8%-Aa(GGj!}s6G97m?p9#
z_IMg1jf)@AIxAoi2{d9q9<6!j=RI;#4um&QjM?uR8Oo|e3<5Ix(jW`P2bCZ#82Fp_
z2oCd8iokxZyy(BbtvWlqe5JDJc<@M+9&_R$*}k!-zVn^GR(35LN6j3PP&~D^00|q2>VMMeg46
z(y`X_VTYj;EGcD^u4txFvYf)b%Q`
z7mce(NFdg@6!a{3Y21n=mt$!4QwJ{bYqrKl5=p#hV~n^zf;>FnvTb18nF2nB^4!{a
zS5yEVGzE4r%F=y*%0_V7?&{-3Fu)LL<;1iG81L#S(6ZB{I0x#75`<=glRaSdqWd4M
zzbsrh=yFoEkJ*M5+&L{o^T@ROX8SA|dm%E`M4}W};LUCo6pbo=Ymu>N-EXyE&rmX@
zi5!xEgW9*v*Hlc8HDI1*<)^uqBPvbZv%&g>M!^>N3}e)%kCY&tz0!`WJTuJF
zO;p0T`$kze#*+&e)UT%`q3fwyn)yQG1{bt&SA0Y|IRH$y(U;(!kkQLsMOZBx6vQ>*
z?qajFlg@G$)eCvN&_Em4l(f?Pq?FBs4qii6}wneg{4uZXpIW8
zy${__61v)h*FGh<2$IeM<^wLMahzu<=(WPh^@>0R+TxjxL?pqo7sC-1&^zr^6>Z7*
z_EuYz?}ueQze|Y)$LAB%eKs2QkJdusPFv!aqG+@tl%0de6ifHirIU&==fs7-w|Q@d
z3gyw2-V4h`-+0Qkn
z8hXV!KOcvEPmM~c*OOJchv8h9XSUPhGIPm6vXU3TqvA&PtCdkz9DfPNCQ1nd_aCfZ
z)s?=l)le~Fh&_;)*}iGA$GBv(D(4-^N>bzZ=`W}wwQXqBP~jcq??=(QOH2q8C4$KL
zKE_3-f7=YLb?TUJBVx>@g|M&Fs3w)`b~D(mQ@01(05(6=KR@^oKyjCZ8JtR!^YhSL
zH>=f3OU;xfS_nd?+^A|%GOKDfs~aN+k12*Bkor9qlxY8Nxl0~`X=(2-SHm#jcX;QM
z6FY4(Wq0!c6E_a;yKA8s`H7ksC7QWc_nlEo%qd8d;k6DheW3&(QC
zK{@B2Veo$nU7b61ADAaOO9+&c-vjQ#FicT#a|gmDPDL)5V|uaO(p*l^weWikrp4_#
zpT+sVY6AiSz+lj#BG1-*6weEW&zz^G8j{zAg#8ud3DD%i($5nJe=&Z~kw)2>GM=IV
z()k?p_8`>NPY#cj7-iWxgm@xJX=$su26YVJJ-!GvOK!p;*hSLs>9NdqomF#=_Fzsn
z>nfOdsXyFFkSYqIj-91*$Ik)*x
zLKjco&$`2auy5KAs`tLDZbDqr)+r$&Gn|Tx`|Jgy=eX~O%Vx51;uxQB
z;NaS%WKGZ&p57)=akkKo(8T~>HRS=PBguP*j}~FA(O}ZeB_hcmjClc878jkro>q3;
z52AnW>3{CGmkzRkzmnDUJVtTdyx$jc`Q%Wq?$-kU1wi&1cqkLf%=G-ep5%S+6EoTE
zp4}68w9hW*Y8y$($t^pxXg#tx@S~%n+q4s#ND9Xc<&UScKfZ4K{2n7*9b1U<)=+Rs
z`nNjXjx&4jqV2M*85j84PjbB2tXJbQxxcvr$TRcM_*s$CuAWV(Nb*Hy_8Pv%(-V*S6@f;ew?17+?<(+X)Zj9DTmA2c3-7_@1-PYCRSF|
z%$hlV-*1446jDY_+HzDu1J@@vSrkc%iGhKEkL%7GYW+8`ml(C225FQyBS@Op+vkn%c530xyfD(qdAl3Wc$3NI5YB^*Z^}(-X_4
zUFTIxt>4#$a_A)}CFn1IX}b2qehB={Ml%HEUNkx#_kh3a)y$CocfF20flLhfWpP1t
zyZ?0fbVvpO8_JL|GoyqMEPcJ~@aJ1=1u=v9H*Vf!FeWH$doK=)$3zv_PpeaZ@+c<>
zBsvL!PBVDT^X~3!%uisYU2Oy9>TgVzc*k~g?KGBgB)W`_9;(F$$%}m7;r}>HR-e6&
zL4)snY`@$#zxqbroWvYU5}@+UF89_}_l9q^4lt&uPdICx92e2jO;b%vWx^Xau_Q+J
zVGbsKRrB_4c)R=9c%2x;ZCRGpL3z^*tCxuBb}?*u92FR~7*b5R+HJH%w}&&!AgfY&
z3yzy3FP8ERA3y3`;yyOEA4_*;oOk*Fw{tS+zY((Oi{B^fb__b&ie6`*Om!RR
z`8rOhO4GJOW&vNh`!T#OxP1HzO8F8X8Ww9cJI5)p)(LD3ty4hNf6MB19Ml|%?sy&w
zvv0dEj6`GC_Pn3h`dnF!4O=CY8_FBS&!(j0|GZ9Y6L0actt3fb_8{1#gMmzVWy*$J
z%usqfW(>EF>AAQi%v;WpiR}82vKwBe$IhglhLwi+T{SU@oop(~b1safxl
z2i%czQ_nwMZYcdEoi27He2)EAdKh&1K!iykXnF7Q)$j$#AG&Rr
zglbnMYs6oDj)bbw)0oDi(-z_UqTGtP!M^pmOQ($s>ekg55-iJDq@4y*qRiE(5~!gF
z?5KD2@3qYwa9;>%^?Pp2%|`3eeE1Blz51SM{#f%6wv8ty37v=Jp+YbkMD%rx+^x$%
zaC`fHQMQiByo|ON*DueO0rp=!k|aTX@Acbm-?MMkwYdZrW*~Oll6E0kDZ?5Movt6x
zTeE~icz#;3Z7w<~q3=Ae8U49R(O#ATPFMD2xeK)k^=tShFa=ficc+5PnIL&9A0k7S
zkWCE9tqTK-(|Z5Z_w>C0!alJi97dE_bM^jQ(uMP@vS`*Ga@?;#DzG%x=m#@UvEIwd
zNbkr<&M?|jIFm(aKUTrU%?T9qNu-bGJHb5re;+as1KlddHqspz$jd&}E?2U+cu1Xa!T&d~sws6bO;
zxL@Z%gFQEZ8_B((>{7FB9V;%x=XZ;4hl_~KH)UX;`E1sTXM6t8coUk0)h|i_bDQy`
z{ua1uWbqQTs*;k!9WQ+LC;oTM!ot_*^GJ#94Xjjkx1|xNQX=^sZ7A2X8*IZvCc&?m
z2%Q92t-4JE7eP7?HDIdMatt4J|rqjnU#~jg^Lgi!$x|&S;njOcCccI;emgZRD6m@Yp9e(wwYelO
z*w&{<>$lr1eGb4rcN<`ue)>Ki56=0O)(}Gx$TEeCc&i(`MY02x3^dPQ9O2D|mAi4<
zAn39EycZWM*7sBs(r>*bZ_G?NuSvc>tk46@JTGBjC>pft%h31hTQ9gYGh7mCmkOqU
zewDBCVcxzWxWdg10IH=41ok)z_}Ob|xO<6O3AV!3<|JZ74)FQ>uBExLd^^iye0;)$
z;l7^GThnO<67!>Rpu`n*7Uk^HYT(#o=^upj+3WdM}ffrh=<)&q&rDteo
zJbd)2(H)R#b#=Nb^FJW`)}oirp1}CKJhxMGHVPb}2cPCv_vGwC-O4z)zfK>U9~Qy{
zpw|;ca_MK$4LZH{Yz^5&i1jcKzH(hz`JOkTYj3RLwMocs$MwoBw%ywnu1vh#xO$vf
zfDC@CHk2ice(3EmVwg<-o!rHS4%J>`)qWo6w>H_$qNJMC@bBL7^QpCz?|-l0nOP38
zbwzgFsJ2eb+^cIyZA#L@IYoyN*~k6*PDj%AnlM3>;LVxsgA4ZYuPciN?9y`z`imT-
z%Car;VRO|B{DcJBOuiP(1!T9|j%A&+;>{yjrKua)>De}LKbZVU^Te@+?6jfKSFC=l
zS`Aob5DTM=ty?i-BVu!F4|^1;JH4YF*0VUo5SEJZ7OZx2KL;cAv+7#?jA6fiA-xKDaG
zM5|Y;rPd@`F8x9)|6n}OtMD-n^$zchpWE%E$g*rBjQS``WCSZN_J5i7T>?(ZP
zlu09+iw#RWG-OGl0(X2=P5ls>bf9-&V*G)l*L|X*2j(u`T-cZ|q<
z6@}+>%(nGx
z@mh(4UrV`}YfEvQC(qo4!?IJhDH}nl<8Q2zB$@XwslBqCVCeHFKcAz5ACH&6Gux}!
zkdd-ph0aw4K8^>P`N`nI4jtJ@;pvnrY@Za*8k|_hsHLhImXv=wX4?^{#6sVeB;
zg^Z9+nl6IMwKLqPsA^)zD+Vkcm&cn;^|?@!GIUL?QIUPHXR~cLcrQffSI(;^W*cs9
z;%Okm^4_k_@K>b?BU!sM2eS`V6P8pnlATQ*r$UUBy#4{UT#I*FvWZhh$COCU@1&x5
zgAT4GI4@Vq?dB}n$Aw!XIYD}tm*JD3P5Nu`<}}l$a*(2_AcMrQTWz1=+SA1j4S5U?
znSSenPPyulu=7wk5-P`S4O;~(8ZeXre=7ErMA8fyh5GxjH!OP|wTQJN3e4M-RGL8d
zR4`%bD$_I4M(C&2Lk5k0^XfK1w-uW0`^@C!8lo*Ck$F^&;BUG40wnt-77RQap%Ssr
zFYx^w+-&?N!z2>6Bgk1Us>vA1kwF5i?ZNd_PTK4FJ~lo=g%t0hB-@6SVR3x!*3S`i
zn>5&ox7HS5#@7-&$JbE)u%^>SNni}1+@ve$g-=2rcNsh
zx)ANH+M9d|J`!I%Jv!m^B=ktZDhlOE_E=9
zROO}dEs8hVI@@D4WKs|DQ6fdJMesvxZBq{R$A4iNF3{Gcd>&rkIl?D;Oj5?U`^t8COai=JKE^!9d|$
zTYA2KdxK$$LSl3csDMc@hTtqhk
zTz%gEa570dnVug1s;Jwa@%#8>r;%jC*pw;*RogeA7&6K{V6=f<=1yGE{51<)hQ!xL
zb(!@f2}8uK1x*RkKj{F9#PCkPrPT9&Mc(f;;Eg?L4a2%m9hkYva@ELy-DD-M0MWB#
z6Wc+3dG*Ii_4{e!B%_LX3lKyS!}3z`c7#APCBb|_q+}bG|4Pt6(9zwyubu)ge6gY#&I;s(|MYAh?%LMTd)V+9OuoP^qGuX@akouSX%9y+6yR8Vy?(x
zsto1vI*DFs2~y?(eG)TU67m(5Hh!n2&w>H(3^SqtG$km1q!|t{6Rr#r4h9Jk*-7X~
z+-h38n`*zi-M)N(5tf?5rASsmTnnU8qxf5aT29_nJd#F22f3K19@XI!`YQYO1q-08
z5uUp_4So5S>vds2j@h5}W8LsaqRffH$jGty@vbmqA(^_-qDe{Sn)Fm*Zth&+K{bwJ?l@Andi*9bf1UzuylK
z*jk#Hl;$sDK?`AXPI+CWeLD(S_)GKizlmS`E}e2eaA5p!Gaas^A_y2_l&0%UP!d2r
z%5re!$XT5|O`o%nk8Oev81F0yY$tVBbjl(_@V|C)wL4v_X_F-aR(HOiTRFeKc7Avd
zUrbEtb{j`Df240^8y&_
z*xa@~PITS2NV&q4$?8me6cy(>Z+f^f!(A^|6_u3kvv0i3nBto`m}CE#Q|H#q?(EE1
zI=k)oyr@VN1clmBt5q4?#4jYLGTt0%CsEh51@sItuE^gi7mh>qabC5`VauaRmY7S%
zgw(dQq~LDmdK{-0(&yAX-1xq9R;pDOG+q~h&XzeU*-x1qE(|6XC5i|>-%rpl7>Be>
zkpztPTv=cP--NuW#Qz4uX8^t@<^eHKF3
zp_IPIKw0lr<#M
zfMZ<`nY5~`OW1YYjgaJW39^(aX=zoI3DJwXxxGLUS+$m6`=?`@71ga&X$C%gJ>>p)
zZ}tz7xMsDswCFiau_Ex?_G#O74^Ky>)sm3$*($*%sHmuP-H%h7+-mQihP!2L}
z*%hIut+eaZOl7i@-|1e8)gJHmp|Emtg@;>7%HsK_-*gzni9!bh=&_jY{5u!ew6H
ziFb86O>>HO*Hl!T&*lp!(*Hpj!ok8C$SE_aR=e2lu1YEmUI^?{G0lmz6C#7vK;Eow
zXlT&?+(&0-)$-;u&-v1KEdVfFU>NlAyQlJ`{pS~hQ(XZYeSh>l;`zKoDlI*+SZreQRerSDc
zbbs5^^m}Tq(P^vZc&U0^e-_B_S*X&7-X~Gx$3-Osv5h^(2iak~G(X!|oz~b~+~B}6
zyyP^8NjYw+w%hvXFRY{ce(ZwaYd3fgj{!3ycNXrncK3L>IoTQ4#_})+$0wgmH0V%I
zIHshSY*ZVqAANs)@c%0d<$Yc?_BLd@*J1i;AUzL(!_FgeLQk77NibcS)RpDEVSB_m
ze|&x$^uE5V`%iKuGLo4x=F{1Xi8SrWLNBC
z*^&v~*~l|@ZE7v3v=_vIZaHMj6etrAVWLzVhaI@;G!$KK
zE&x%yoi!^$C`g&fMBm&Wui9&02Q%gg`Fxx-*z&M_6rE`bG|J#tf}l)wdOFX~V^yo4
z$9-Ja6
z<0G4$`}G9w`pakx8C2LUn1uKP=mCX2Ha9D*Hu&k?Mx4uy%~e++eTJ);94!QJ^7DkS
z;a6wN|Bd~KqLb+2pN3$^6khn~{g;(}jU5L4@kkergD3e7lU&YY+zqAnlH-2$hOJQ_
zy?tatwH@ukG|Ib+Qi6ybd!G+GxOQV@o|nPd5Wt5a`*zjH<&V<8a)A4}@1)(z`dp7q
z`%a`PCSDGdX3i!xt-#<|jH^NX&2_n){c*9}^9&6piH>-%?+i+gyGxAAt8d`fnnM^W
z>dj9Kng}E2NM@3lg>(MI%r_|LIz|g3sg6b2y|Y(a|kSF5xlWifngn^M3zxi32^lIvlWw_$Ldxk+N};
z(|V6cP%_Nf`t`N5`f11eOt(N*^N(hBpTm_T3C{Nj{p@P^dIJNe`=wx
zBFTJrj#4MFviNPpYs*DUnbhr%a{kXxuhuHf#Kc6C&>{9izx}o9PVKHLP)cX@^9V#4
zB(ao|1Z8)b+aZ!=N--~uvkQrpJdJrbUqXJs5M$^oGq%;wL$p@?^m5pJxrwTEJm4*F
zUQ{u1;;7xcwJwY}T}bY#wD(5TnxmiGHe9NIg)P-_z0p%
zH+C#%WaaqEr%Pk;=~1`MK`~FWRrsotHoQ&6jcO*KkeZ|vR9Qt3^hp_#*adfB;@_$K
za^_(prfO%0rv?$urkmgE0#W6UL7^tv(=Wk$g<_D4MW~JO{78~v`AakH-XDIw%Ji5F
zZe;kc*Ju#hFW_yVn#GMJFVz~(6B7*vO@}bRL$Lu)eH6dDkDc-h(1{iYE9l5c_{@o)
zmio|hmy)8lW3rC2CTdt-##w#hcqeUt;6R{3p=En
z_$Nvw)xA;xvV4ufKo5~aJ>XZsa1bUTvN)kek}8hI^U7;wbZ9abE-i+x+KdhNK#0cW
ziJUipgcC_pIsp;WcXpvTM@Vz2z_5(g!}Pjw%jjR2uemY*;?yM3A!pU2$mhx*ev_6E
zWBxA=A%yOOb4{I8TAXY{Dx|kIP0DHUsYKhb@+i3F6%eG>^4juzY9&
z*Y#XWHLwn&4#D`q7-)Mb(xLy1!oWpEU
z^p(OLhE`E>C|_7>dFcQEl2$0CUcN^M@^?dob_HjHCit*e*
zLr?5#bPgRf$`Q)2dOpT&>m9NP!Xz-Y$GLPwKp;Z6A-?)q#OGZBr-pfr_43bNFeeeM
zahhyg-r
z(&!x96V0w{7N8@0;rxhI7kEsKvhx4(o)O<_2u)950fe2joU$9={rMq1K%Ye+=u1>e(OoghVpzHErYN*-u0Cy^iViad
zbv44UOcWkT28Upbg?Hw%PW0n}5QTpR6f3VV;S5p)r|@R+ZI4Rrc^1G)HL-qI
zgowD#KnD8`vem=TO{F59SG7JaG$Wv638IafrJa&}(9+vf89$zkM~Wm1E~WSi-asjN
z$mci2omBM2fntQe`z?Ul59-2*BmU%aPv^O*@e+zFfT`bkoVB0Z(~eI@*&j9u6+pR0
zAdkKg6tcaMmmM6l{yyA#xer`FUu4e;Msx3xf)J20(;!)K>9D=F8mTYt*BB@0>6}$I
z#0e#OP_-~D=_o|BElEs|RazjlC7H;+kMQHG&5MG>BZvLVl#|9fU#JA$4Z-(8zSFlU
zKPI3I}J?^&EMEv=m|6YUlCIu6%GP?gZnH<0=O4e1E$Wc}0OYT#I0f(@E&k#v34^%lC^vx4*NU+yf
z_06gid*j{vk(8p|LG|=$Ujp4bg0XpKbyMbw+4cYqF&F+n3sj<)|(q&X5J>@6<2<{np25PQ`4xM4wi)8w${o
z`=I;0sdJ`SCXmF6y%6Z8uNYuBa;XHKERp}4_)fF#AF^VihU34{1U@>X=1cs!;50Sg7#
zYrx^BKULwHVTWbPLRJx7vf`oX#F$q{fg|iGd}i@qoBT^kcc_k8(VB&iU4x_yZ)+xX3
zrLeUkF+`=9uqjM3okOj4cK^sMATd$3oT~uAL@=F5H`HG@XXB@$l}jxgJ5QPG9Tp;dbD1lJvLpy#x>cAbg;72)Fn-#Wb2&+g$ai
z%`x%i3L?5L%UNBt10W5NIsO11ZxzYsA8mO2Nvdk?OtU?01}3ANcMvJiUMI)7rqDi;
zGhXU!n`xoAH+iMT8F97daGz5Xbv$ZbPeVKXx7p1VY`7J!kCsKL0qlzy>x&jg)^(!8
zr<%pD+Wbs{o+`L-e-~Q;Mo%Z5{5>fVbyDr4o%D?U`UYksSe{jkLBz!1(9G_#aBPTH
zaScVBOR+1LI&9jXu$}Xat*0RYnvDjt*~P+k1+0zGQMNM}rTcpY+iC$<
zEjBQp&;cU(x4>TzKQKFw?!OkF5$8N?dWS|zzkWSTeVub!Xs>q+xe7teA&K{V@2$zM
z3Kt3BkPs@zfm*bSpU~@9hhx$aPq9_NhFqzqnx;hR>NeX`K}HRtw1`oR&Ga-Cy}3bz
z1hw)NSdzqoslWF_1vixzr=CXuR@y0^#98E2a9UbAy!GS&z)m+qD3Val$dmNbysdRU
zHp;U!yhQn!6qU{$aSP}XRs6Hy(d{t?P5Z$H|0ib-nDNp>qxVh7Ow5GthJ|_gneY36
ziD%vEo~tV}cXV}N6R4Motl9%Sj+4c(9gd86k!bP5K0RAVkT7?N#*ysfj8)}0MICP#
z2h~$Xz+$u0Cj4V<|Dk@ysbpghdg%3ZKntiLr+B@9pMX8#$Pcb4_DT;?*q>XL6xr=b
z8~v1Tn?;9lDtk1KO$M)9lwao3Q8$A)S42^$!r+HA8XRfpQ;i8CDa2$nuG8wxwHrRX
zs)UW>l87Zr;K|6mWl?UHRrEfQvf{9KyAVpuePR+67m3OLVZmgrkMQU>BZgI()-}u6
zD0FO7+iG*1H?Q!*0t-A5jFM)M6D2=idf6=|S};zVh4!25I8rr+Kt{%)O%S_xWpVEN
z8K@qg%8_cTC_nesY7d5vPG^x%0GEOxfg~*lu8ANrE}6q6Rbc$Y%wArRenDjc-QH7?
zWHvuLK5%R)SW#Sb?~+W1F^)zG#HBV+9-Ii5M%GyT1Uq?im?_+%Pt2@OJal16WpOTT
z|Kx&ewb>R`6yG)9Z9s})xde@o1DzIvAt#iOT0TZFNaC>?9=@bJKRZ)Y!|xAhSY~$4
zUCRn8T#OZpbVO~fawvP5RB9?^k!Lhj)*$M=JaXIOoDVFXlk}~65y9bdU%GJ4HKkUn
zEftVmh$b6^TtOTmsw@uibHtvORE71>2IT2=C9g_G?lIjQ{-!fU=t=-H6WU
zU`-cehobGPf+~{Xqbw4xqhuU;icTmh^pBrcc-#5ac4u1B3kEecTdes`qb@MGuNTed
zr9x?WJ4aE8B8F_i^J)TuapW$}z1wQ|?4_kwESZNVqb_oNG;jqE%4N3|nu7#;2}an30(^Or+6tlX1ek%vReRN20Iadw4*Y
zIPqSHD&-l?i;@iiuqj+5L=*Z_kLB@esuoq0XxpPsr6|Vd2`K`$)n+ep+j0y;NBRQZ
zu-I;QgegAO-XWH>pnG~2cn3?7%vqjqaeH{UrO_gWq*r->$
zmt}@xXh0iucPz~K~J{dx%JV&;1Mq$mjJ_ixgO1tk_{}#H7@hA
zTWn76F5%sgJzFg=orUPv^$(78TJZCm|2@$ffyD~Sr#FlY;EIrk|=3WINDTM>8=GHoh=^d9EuL`m6x9O|8Q=E+mjGYc0SQU
zPpdPG51m)|!PWD#b8_isn7%ASQRX{4U9QRuOMyAqHx%j##+jt5OQzI(|&c86m4^oe)Yr!2JU#F=Cs%8+lctD|FIW81do!Tmj@dP)o>6fqp%m1f$;+?B)DW0F0;kTC$-hI3sUdKt
zBcSo*OfNxA{+U2P*qS$oHsj)2CKGra^g`DX$F
zjVCjKvi6QM9RZCeXL<>0^3MbU8c${dW$hhjIszI`&h!%0-Fo`x3x{fzFD&XdM%4*5CSJRuU=)WqoZTRiWQKApDcB=
zdGqGQix;0kdDcYL5I9)`PQ{+&<>fv4=%eaQfAv>?rIF-hLD%A+aR{7>Jt33+f&Rry
zmUee{@7lSeY;NTlmu*d84S|zF;N-sY;RCvcp25SN13iIQ`32Xdced7rUE#Lg@@%*H
zsAa8BN&+pihCu2gFj;#t;19CP*`IeeAM6+y42D^P#1sj{BOyatmPH>g&v9RK&YU&N
z%d*q7l{r(t&@~B98i7ghBoTjQSHln2?XT-%9eABsbXzVhCze!XJwmwzBWthlUHY61
z=f|&DaNEiX?c?l|E(h&_)J9+ep0Jw9_g~%hi+Ae8>IsS-aydB`F&HHSD=m;mezLqA
z3*g?myz~n;=&_m_A5bp1gVQ!$Bk9g7#Jd!BQcrS4@eQo<*>c9tLX=SsUb>=XI>LeLtv5!9G5418ajT0B|-N`wrEsF
zL-=1R$R*z)4?KYocxaq+2P4D&2TyLO+jvkLr=MggXwgy~f$@0~4Tn&4c7GRZZ;vcN
zEnF<=ZgB<9U|8rTCVw19yiT3y&E}Xcx}%|+c8j)b*!&iXkWs7+u`nz=$WNL!-M)}_D43m|a*Ok(da-Eor5FOo
z@FbB4hQb5>5E_q#Kw7k)fJMQ=Kp2O`RFLkx>-@P+s~Okpx0?^KUpodzaY-~(h&{aF
zn}J=k{h@G*WmywPL*S$l7^fYtrlPa+^}sQ5%vonR1#cD^z!CoPorfQCSdAuyIF^k3mh*^IhyB!cRr=)y#Z?HY~P6#Of%
zKg4kRyA9oa{?Lm%8k+ltmK0~QKQ3{wK4NDOxzht23x^}@wq-SG-v*~xnQP*lJOX2R
z0yo%}DbK}TGe%(&WEiH3!9cIp{KAaO7ZkB+6+K`OgUtY80xVJXgl;Y(tN83&ljE|a
z*|f&V$rp?EM2aCWmM4g3vstTi9GDUsBm}iy1bh*V6&)R1u?H_(u&5}5Vfl+H3re%y
z+v~gN5hDUzQNt<9-Qs*fzT0j){Tm6T80MNdXC4B_wBvO;v&FWo$m6Q%4u~CX#aKHW
zpw+=dE>>8n>m2;i+PxoMT}fvbZrHc~yrX+CfU72WGScP62~XKf`ith}=#AsN;>^QI
zlX!L`Fpd%%&F0F&>=k(}Z?=R-+ZJknGtuXpNNhOR#z3UqV)BO~pvN3xF~%YT6C#yK
zVNdE+#qMRLIkMR@yD`>sf94}Fj^BmXrOx(qwNY{&KIALZ(;_g)?X-?;v50RDw4FTOaJOLH;C_h#Z`8P3tovQwV)wzh9fXOPso(T
zYAr09bN_|&ZZ5az*ql8fCvHiSNXs!in`@*CSeO&0g5jFoRGsnJs}|&BXVYJHhJ&Mt
zuOTpufauFQ9vIvT`2B4yO|RF~zEpG#0003cNkl&a3Y?N8%Pieh5CEC4>vZyeW+_&N4VJ+
z_s3XWMSOXJSH;YGi#}H9G@d`lb!ByaWm&N^&7(TU&O9(Qi8Ta{gTMqlQBTnh2?YFu
z-u|wx?#6C!t2fx|kA~w3i_wtju*}JHl;vjR_
zcv+E1I2;P`kEK||bT1=gEf$N-X0}+dAzG{bOw|HS?uigM37(85C0Zm$1&tm@fuWtA
zod}!?PtHyxv|MQj93KI#EpdEov^yFCBM4|b89_q(t08cF1T>x;9~
+
+ X |
+ 1 |
+ 2 |
+ 3 |
+ 4 |
+ p |
+
+
+
+
XII |
1 |