diff --git a/__main__.py b/__main__.py
index ca8e13a29ad15f0e464ab98cc1c79754be4f32b3..b369571643756636ca86f40317669f015d10a616 100644
--- a/__main__.py
+++ b/__main__.py
@@ -83,8 +83,11 @@ def node_is_full(node):
 
 
 def redistribute_keys(left_node, right_node, left_index, right_index):
-    right_node.keys = left_node.keys[right_index:]
-    left_node.keys = left_node.keys[:left_index]
+    for i in range(right_index, len(left_node.keys)):
+        right_node.keys.append(left_node.keys[i])
+
+    for i in range(left_index, len(left_node.keys)):
+        left_node.keys.pop()
 
 
 def split_leaf(node, key):
@@ -477,7 +480,6 @@ def main():
     bptree_delete(root, 47)
     # bptree_delete(root, 65)
 
-
     bptree_print(root)
 
 
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..2ab95ed890da7bf58a65f046688d633b0d6e5fb4
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,24 @@
+TARGET = program
+LIBS = -lm
+CC = gcc
+CFLAGS = -g -Wall -Wextra -pedantic -Ofast
+# CFLAGS += -fsanitize=address -fsanitize=leak
+
+.PHONY: default all clean
+
+default: $(TARGET)
+all: default
+
+OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
+HEADERS = $(wildcard *.h)
+
+%.o: %.c $(HEADERS)
+	$(CC) $(CFLAGS) -c $< -o $@
+
+.PRECIOUS: $(TARGET) $(OBJECTS)
+
+$(TARGET): $(OBJECTS)
+	$(CC) $(OBJECTS) ${CFLAGS} $(LIBS) -o $@
+
+clean:
+	rm -f *.o ${TARGET}*
diff --git a/src/bptree.h b/src/bptree.h
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..3da830eaa6c695c46fe8f7194759adcb75c41e20
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "sorted_array.h"
+
+int main() {
+    int *array = (int *)malloc(sizeof(int) * 10);
+    int array_length = 0;
+
+    sorted_array_insert(array, &array_length, 3);
+    sorted_array_insert(array, &array_length, 11);
+    sorted_array_insert(array, &array_length, 5);
+    sorted_array_insert(array, &array_length, 1);
+    sorted_array_insert(array, &array_length, 15);
+    sorted_array_insert(array, &array_length, 12);
+    sorted_array_insert(array, &array_length, 8);
+    sorted_array_print(array, array_length);
+
+    sorted_array_delete(array, &array_length, 12);
+    sorted_array_delete(array, &array_length, 1);
+    sorted_array_delete(array, &array_length, 15);
+    sorted_array_delete(array, &array_length, 5);
+    sorted_array_delete(array, &array_length, 8);
+    sorted_array_delete(array, &array_length, 11);
+    sorted_array_delete(array, &array_length, 3);
+    sorted_array_print(array, array_length);
+
+    return EXIT_SUCCESS;
+}
diff --git a/src/main.o b/src/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..430793ffa0d07259fdf13973a75857418dc744d3
Binary files /dev/null and b/src/main.o differ
diff --git a/src/program b/src/program
new file mode 100644
index 0000000000000000000000000000000000000000..d77345c41e98d225093d0a372100bb75b4155945
Binary files /dev/null and b/src/program differ
diff --git a/src/sorted_array.c b/src/sorted_array.c
new file mode 100644
index 0000000000000000000000000000000000000000..0fc9d9190fd037d48a186151f45aabfc03ef59a8
--- /dev/null
+++ b/src/sorted_array.c
@@ -0,0 +1,83 @@
+#include "sorted_array.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int lower_bound(int *array, int array_length, int value) {
+    int low = 0;
+    int high = array_length - 1;
+
+    while (low <= high) {
+        int m = (low + high) / 2;
+
+        if (array[m] < value) {
+            low = m + 1;
+        } else if (array[m] > value) {
+            high = m - 1;
+        } else {
+            return m;
+        }
+    }
+
+    return low;
+}
+
+int sorted_array_find_index(int *array, int array_length, int value) {
+    int low = 0;
+    int high = array_length - 1;
+
+    while (low <= high) {
+        int m = (low + high) / 2;
+
+        if (array[m] < value) {
+            low = m + 1;
+        } else if (array[m] > value) {
+            high = m - 1;
+        } else {
+            return m;
+        }
+    }
+
+    return -1;
+}
+
+bool sorted_array_search(int *array, int array_length, int value, int *index) {
+    int i = sorted_array_find_index(array, array_length, value);
+
+    if (index != NULL) {
+        *index = i;
+    }
+
+    return i != -1;
+}
+
+void sorted_array_print(int *array, int array_length) {
+    for (int i = 0; i < array_length; i++) {
+        printf("%d ", array[i]);
+    }
+
+    printf("\n");
+}
+
+int sorted_array_insert(int *array, int *array_length, int value) {
+    int index = lower_bound(array, *array_length, value);
+
+    for (int i = *array_length - 1; i >= index; i--) {
+        array[i + 1] = array[i];
+    }
+
+    array[index] = value;
+    *array_length += 1;
+    return index;
+}
+
+void sorted_array_delete(int *array, int *array_length, int value) {
+    int index = sorted_array_find_index(array, *array_length, value);
+
+    for (int i = index; i < *array_length; i++) {
+        array[i] = array[i + 1];
+    }
+
+    *array_length -= 1;
+}
diff --git a/src/sorted_array.h b/src/sorted_array.h
new file mode 100644
index 0000000000000000000000000000000000000000..e1088323b25e7064aaa6617138c602bb3da527e8
--- /dev/null
+++ b/src/sorted_array.h
@@ -0,0 +1,15 @@
+#ifndef SORTED_ARRAY_H
+#define SORTED_ARRAY_H
+
+#include <stdbool.h>
+
+int lower_bound(int *array, int array_length, int value);
+
+int sorted_array_find_index(int *array, int array_length, int value);
+bool sorted_array_search(int *array, int array_length, int value, int *index);
+void sorted_array_print(int *array, int array_length);
+
+int sorted_array_insert(int *array, int *array_length, int value);
+void sorted_array_delete(int *array, int *array_length, int value);
+
+#endif
diff --git a/src/sorted_array.o b/src/sorted_array.o
new file mode 100644
index 0000000000000000000000000000000000000000..b5cdc315a1c1cef35f42c2424ca12b6288091a13
Binary files /dev/null and b/src/sorted_array.o differ