diff --git a/ex4/ex4.c b/ex4/ex4.c
index 68c42f87925707af4c7b24501335064cba34549a..7d153f8589a7b017efc40939778dd410494caeda 100644
--- a/ex4/ex4.c
+++ b/ex4/ex4.c
@@ -1,6 +1,106 @@
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 
+#define QUAD 4
+#define SIDE 16
+
+
+
+typedef struct node {
+	int value;
+	struct node* children[QUAD];
+} node_t;
+
+
+node_t* node_create(const int value) {
+	node_t *node = malloc(sizeof(node_t));
+	node->value = value;
+	for (int i = 0; i < QUAD; ++i) node->children[i] = NULL;
+	return node;
+}
+
+
+bool is_leaf(node_t* node) {
+	return node->children[0] = NULL;
+}
+
+
+void mat_to_qtr(
+		const int** a,
+		const int x1, const int x2,
+		const int y1, const int y2,
+		node_t* node
+) {
+	if (x2-x1 != y2-y1) printf("PROBLEM!\n");
+	const int size = x2 - x1;
+	switch (size) {
+		case 1:
+			node->value = a[y1][x1];
+			return;
+		default:
+			for (int i = 0; i < QUAD; ++i)
+				node->children[i] = node_create(0);
+			mat_to_qtr(a,
+						x1, x1 + (x2 - x1) / 2,
+						y1, y1 + (y2 - y1) / 2,
+						node->children[0]);
+			mat_to_qtr(a,
+						x1 + (x2 - x1) / 2, x2,
+						y1, y1 + (y2 - y1) / 2,
+						node->children[1]);
+			mat_to_qtr(a,
+						x1, x1 + (x2 - x1) / 2,
+						y1 + (y2 - y1) / 2, y2,
+						node->children[2]);
+			mat_to_qtr(a,
+						x1 + (x2 - x1) / 2, x2,
+						y1, y1 + (y2 - y1) / 2,
+						node->children[3]);
+	}
+}
+
+
+node_t* qtr_copy(node_t* node) {
+	if (node == NULL) return NULL;
+	node_t *dest = malloc(sizeof(node_t));
+	dest->value = node->value;
+	for (int i = 0; i < QUAD; ++i) {
+		dest->children[i] = qtr_copy(node->children[i]);
+	}
+	return dest;
+}
+
+
+
+const int initlist[] = {
+0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+0,  3,  3,  3,  3,  0,  0,  7,  7,  7,  7,  0,  0, 11, 11, 11,
+0,  3,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0, 11,  0,  0,
+0,  3,  3,  3,  0,  0,  0,  7,  7,  7,  0,  0,  0, 11, 11, 11,
+0,  3,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0, 11,  0,  0,
+0,  3,  0,  0,  0,  0,  0,  7,  7,  7,  7,  0,  0, 11, 11, 11,
+0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+0,  3,  3,  3,  3,  0,  0,  7,  7,  7,  7,  0,  0, 11, 11, 11,
+0,  3,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0, 11,  0,  0,
+0,  3,  3,  3,  0,  0,  0,  7,  7,  7,  0,  0,  0, 11, 11, 11,
+0,  3,  0,  0,  0,  0,  0,  7,  0,  0,  0,  0,  0, 11,  0,  0,
+0,  3,  0,  0,  0,  0,  0,  7,  7,  7,  7,  0,  0, 11, 11, 11,
+0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+0,  3,  3,  3,  3,  0,  0,  7,  7,  7,  7,  0,  0, 11, 11, 11
+};
+
+
 int main() {
+	int a[16][16];
+	for (int y = 0; y < 16; ++y)
+		for (int x = 0; x < 16; ++x)
+			a[y][x] = initlist[16 * y + x];
+	node_t *root = malloc(sizeof(node_t));
+	mat_to_qtr(a, 0, 16, 0, 16, root);
+	node_t *copy = qtr_copy(root);
+	return EXIT_SUCCESS;
 }