diff --git a/students/23K0120/23K0120-p31/pom.xml b/students/23K0120/23K0120-p31/pom.xml
new file mode 100644
index 000000000..d8f94be48
--- /dev/null
+++ b/students/23K0120/23K0120-p31/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0120
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0120-p31
+ 2-3 Tree
+
diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/Main.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/Main.java
new file mode 100644
index 000000000..27f23e55a
--- /dev/null
+++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0120;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Тридцать первая практическая работа!");
+ }
+}
diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Main.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Main.java
new file mode 100644
index 000000000..d7f093713
--- /dev/null
+++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Main.java
@@ -0,0 +1,26 @@
+package ru.mirea.practice.s23k0120.task1;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+
+public abstract class Main {
+ public static void main(String[] args) throws FileNotFoundException {
+ TwoThreeTree processorTree = new TwoThreeTree();
+ try (Scanner scanner = new Scanner(new File("students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/PROCS.txt"))) {
+ while (scanner.hasNextLine()) {
+ String line = scanner.nextLine();
+ String[] splitLine = line.split(", ");
+ Processor processor = new Processor(Integer.parseInt(splitLine[0]),
+ splitLine[1],
+ Double.parseDouble(splitLine[2]),
+ Integer.parseInt(splitLine[3]),
+ Double.parseDouble(splitLine[4]),
+ Integer.parseInt(splitLine[5]),
+ Integer.parseInt(splitLine[6]));
+ processorTree.insert(processor);
+ }
+ }
+ System.out.println(processorTree);
+ }
+}
diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/PROCS.txt b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/PROCS.txt
new file mode 100644
index 000000000..436134baa
--- /dev/null
+++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/PROCS.txt
@@ -0,0 +1,4 @@
+2, Intel Pentium 4, 2.0, 256, 0.400, 664, 734
+5, Intel Itanium, 0.800, 96, 0.266, 365, 701
+6, AMD Athlon XP, 1.6, 256, 0.266, 701, 634
+1, IBM Power 4, 1.3, 16384, 0.400, 814, 1169
diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Processor.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Processor.java
new file mode 100644
index 000000000..a33a4b6cf
--- /dev/null
+++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/Processor.java
@@ -0,0 +1,59 @@
+package ru.mirea.practice.s23k0120.task1;
+
+public class Processor implements Comparable {
+ private final int key;
+ private final String name;
+ private final double tickFrequency;
+ private final int cacheSize;
+ private final double systemBusFrequency;
+ private final int specInt;
+ private final int specFp;
+
+ public Processor(int key, String name, double tickFrequency, int cacheSize, double systemBusFrequency, int specInt, int specFp) {
+ this.key = key;
+ this.name = name;
+ this.tickFrequency = tickFrequency;
+ this.cacheSize = cacheSize;
+ this.systemBusFrequency = systemBusFrequency;
+ this.specInt = specInt;
+ this.specFp = specFp;
+ }
+
+ public int getKey() {
+ return key;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public double getTickFrequency() {
+ return tickFrequency;
+ }
+
+ public int getCacheSize() {
+ return cacheSize;
+ }
+
+ public double getSystemBusFrequency() {
+ return systemBusFrequency;
+ }
+
+ public int getSpecInt() {
+ return specInt;
+ }
+
+ public int getSpecFp() {
+ return specFp;
+ }
+
+ @Override
+ public int compareTo(Processor o) {
+ return Integer.compare(this.key, o.key);
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(key);
+ }
+}
diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTree.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTree.java
new file mode 100644
index 000000000..aaa0e973d
--- /dev/null
+++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTree.java
@@ -0,0 +1,52 @@
+package ru.mirea.practice.s23k0120.task1;
+
+public class TwoThreeTree> {
+ // Minimum degree
+ private final int t;
+ // Pointer to root node
+ private TwoThreeTreeNode root;
+
+ public TwoThreeTree() {
+ this.t = 2;
+ root = null;
+ }
+
+ public TwoThreeTreeNode search(E data) {
+ return (root == null) ? null : root.search(data);
+ }
+
+ // Function to insert a key into the B-tree
+ public void insert(E data) {
+ if (root == null) {
+ root = new TwoThreeTreeNode(true);
+ root.dataArr.set(0, data);
+ root.numOfKeys = 1;
+ } else {
+ if (root.numOfKeys == 2 * t - 1) {
+ TwoThreeTreeNode newRoot = new TwoThreeTreeNode(false);
+ newRoot.children.set(0, root);
+ newRoot.splitChild(0, root);
+
+ int i = 0;
+
+ if (data.compareTo(newRoot.dataArr.get(0)) > 0) {
+ i++;
+ }
+
+ newRoot.children.get(i).insertNonFull(data);
+ root = newRoot;
+ } else {
+ root.insertNonFull(data);
+ }
+ }
+ }
+
+ // Function to print the entire B-tree
+ public void printBTree() {
+ if (root != null) {
+ root.printInOrder();
+ }
+
+ System.out.println();
+ }
+}
diff --git a/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTreeNode.java b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTreeNode.java
new file mode 100644
index 000000000..bd3b83fe5
--- /dev/null
+++ b/students/23K0120/23K0120-p31/src/main/java/ru/mirea/practice/s23k0120/task1/TwoThreeTreeNode.java
@@ -0,0 +1,115 @@
+package ru.mirea.practice.s23k0120.task1;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TwoThreeTreeNode> {
+ List dataArr;
+ int t;
+ List> children;
+ int numOfKeys;
+ boolean isLeaf;
+
+ public TwoThreeTreeNode(boolean isLeaf) {
+ this.t = 2;
+ this.isLeaf = isLeaf;
+
+ dataArr = new ArrayList<>();
+ for (int i = 0; i < 2 * t - 1; i++) {
+ dataArr.add(null);
+ }
+
+ children = new ArrayList<>();
+ for (int i = 0; i < 2 * t; i++) {
+ children.add(null);
+ }
+ numOfKeys = 0;
+ }
+
+ public TwoThreeTreeNode search(E data) {
+ int i = 0;
+
+ while (i < numOfKeys && data.compareTo(dataArr.get(i)) > 0) {
+ i++;
+ }
+
+ if (data.compareTo(dataArr.get(i)) == 0) {
+ return this;
+ }
+
+ if (isLeaf) {
+ return null;
+ }
+
+ return children.get(i).search(data);
+ }
+
+ public void insertNonFull(E data) {
+ int i = numOfKeys - 1;
+
+ if (isLeaf) {
+ while (i >= 0 && data.compareTo(dataArr.get(i)) < 0) {
+ dataArr.set(i + 1, dataArr.get(i));
+ i--;
+ }
+ dataArr.set(i + 1, data);
+ numOfKeys++;
+ } else {
+ while (i >= 0 && data.compareTo(dataArr.get(i)) < 0) {
+ i--;
+ }
+ i++;
+
+ if (children.get(i).numOfKeys == 2 * t - 1) {
+ splitChild(i, children.get(i));
+ if (data.compareTo(dataArr.get(i)) > 0) {
+ i++;
+ }
+ }
+ children.get(i).insertNonFull(data);
+ }
+ }
+
+ public void splitChild(int ind, TwoThreeTreeNode y) {
+ TwoThreeTreeNode z = new TwoThreeTreeNode(y.isLeaf);
+ z.numOfKeys = t - 1;
+
+ for (int i = 0; i < t - 1; i++) {
+ z.dataArr.set(i, y.dataArr.get(i + t));
+ }
+
+ if (!y.isLeaf) {
+ for (int i = 0; i < t; i++) {
+ z.children.set(i, y.children.get(i + t));
+ }
+ }
+
+ y.numOfKeys = t - 1;
+
+ for (int i = numOfKeys; i >= ind + 1; i--) {
+ children.set(i + 1, children.get(i));
+ }
+
+ children.set(ind + 1, z);
+
+ for (int i = numOfKeys - 1; i >= ind; i--) {
+ dataArr.set(i + 1, dataArr.get(i));
+ }
+
+ dataArr.set(ind, y.dataArr.get(t - 1));
+ numOfKeys++;
+ }
+
+ public void printInOrder() {
+ int i;
+ for (i = 0; i < numOfKeys; i++) {
+ if (!isLeaf) {
+ children.get(i).printInOrder();
+ }
+ System.out.print(dataArr.get(i) + " ");
+ }
+ if (!isLeaf) {
+ children.get(i).printInOrder();
+ }
+ }
+}
diff --git a/students/23K0120/pom.xml b/students/23K0120/pom.xml
index b006b0764..a1fb23657 100644
--- a/students/23K0120/pom.xml
+++ b/students/23K0120/pom.xml
@@ -45,6 +45,7 @@
23K0120-p29
23K0120-p30
23K0120-p30-2
+ 23K0120-p31
23K0120-p32