#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
void read_matrix_static(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols);
void print_matrix_static(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols);
int** allocate_matrix_dynamic1(int rows, int cols);
void read_matrix_dynamic1(int **matrix, int rows, int cols);
void print_matrix_dynamic1(int **matrix, int rows, int cols);
void free_matrix_dynamic1(int **matrix, int rows);
int* allocate_matrix_dynamic2(int rows, int cols);
void read_matrix_dynamic2(int *matrix, int rows, int cols);
void print_matrix_dynamic2(int *matrix, int rows, int cols);
void free_matrix_dynamic2(int *matrix);
int** allocate_matrix_dynamic3(int rows, int cols);
void read_matrix_dynamic3(int **matrix, int rows, int cols);
void print_matrix_dynamic3(int **matrix, int rows, int cols);
void free_matrix_dynamic3(int **matrix, int rows);
int main() {
int choice, rows, cols;
printf("Выберите метод выделения памяти:\n1. Статически\n2. Динамически (2D массив указателей)\n3. Динамически (1D массив)\n4. Динамически (массив указателей на строки)\n");
if (scanf("%d", &choice
) != 1 || choice
< 1 || choice
> 4) { return 1; // Ошибка выбора
}
// Чтение размеров матрицы
if (scanf("%d %d", &rows
, &cols
) != 2 || rows
< 1 || cols
< 1 || rows
> MAX_SIZE
|| cols
> MAX_SIZE
) { return 1; // Ошибка при считывании размеров матрицы
}
switch (choice) {
case 1: {
int matrix[MAX_SIZE][MAX_SIZE];
read_matrix_static(matrix, rows, cols);
print_matrix_static(matrix, rows, cols);
break;
}
case 2: {
int **matrix = allocate_matrix_dynamic1(rows, cols);
if (matrix == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix_dynamic1(matrix, rows, cols);
print_matrix_dynamic1(matrix, rows, cols);
free_matrix_dynamic1(matrix, rows);
break;
}
case 3: {
int *matrix = allocate_matrix_dynamic2(rows, cols);
if (matrix == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix_dynamic2(matrix, rows, cols);
print_matrix_dynamic2(matrix, rows, cols);
free_matrix_dynamic2(matrix);
break;
}
case 4: {
int **matrix = allocate_matrix_dynamic3(rows, cols);
if (matrix == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix_dynamic3(matrix, rows, cols);
print_matrix_dynamic3(matrix, rows, cols);
free_matrix_dynamic3(matrix, rows);
break;
}
}
return 0;
}
// Чтение статической матрицы
void read_matrix_static(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
][j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать статической матрицы
void print_matrix_static(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Динамическое выделение: 2D массив указателей
int** allocate_matrix_dynamic1(int rows, int cols) {
int **matrix
= malloc(rows
* sizeof(int*)); if (matrix == NULL) return NULL;
for (int i = 0; i < rows; i++) {
matrix
[i
] = malloc(cols
* sizeof(int)); if (matrix[i] == NULL) {
for (int j = 0; j < i; j++) {
}
return NULL;
}
}
return matrix;
}
// Чтение динамической матрицы 1
void read_matrix_dynamic1(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
][j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать динамической матрицы 1
void print_matrix_dynamic1(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Освобождение памяти для динамической матрицы 1
void free_matrix_dynamic1(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
}
}
// Динамическое выделение: 1D массив
int* allocate_matrix_dynamic2(int rows, int cols) {
return malloc(rows
* cols
* sizeof(int)); }
// Чтение динамической матрицы 2
void read_matrix_dynamic2(int *matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
* cols
+ j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать динамической матрицы 2
void print_matrix_dynamic2(int *matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d", matrix
[i
* cols
+ j
]); if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Освобождение памяти для динамической матрицы 2
void free_matrix_dynamic2(int *matrix) {
}
// Динамическое выделение: массив указателей на строки
int** allocate_matrix_dynamic3(int rows, int cols) {
int **matrix
= malloc(rows
* sizeof(int*)); if (matrix == NULL) return NULL;
for (int i = 0; i < rows; i++) {
matrix
[i
] = malloc(cols
* sizeof(int)); if (matrix[i] == NULL) {
for (int j = 0; j < i; j++) {
}
return NULL;
}
}
return matrix;
}
// Чтение динамической матрицы 3
void read_matrix_dynamic3(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
][j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать динамической матрицы 3
void print_matrix_dynamic3(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Освобождение памяти для динамической матрицы 3
void free_matrix_dynamic3(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgTUFYX1NJWkUgMTAwCgp2b2lkIHJlYWRfbWF0cml4X3N0YXRpYyhpbnQgbWF0cml4W01BWF9TSVpFXVtNQVhfU0laRV0sIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcHJpbnRfbWF0cml4X3N0YXRpYyhpbnQgbWF0cml4W01BWF9TSVpFXVtNQVhfU0laRV0sIGludCByb3dzLCBpbnQgY29scyk7CgppbnQqKiBhbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzEoaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCByZWFkX21hdHJpeF9keW5hbWljMShpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcHJpbnRfbWF0cml4X2R5bmFtaWMxKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCBmcmVlX21hdHJpeF9keW5hbWljMShpbnQgKiptYXRyaXgsIGludCByb3dzKTsKCmludCogYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMyKGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcmVhZF9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgsIGludCByb3dzLCBpbnQgY29scyk7CnZvaWQgcHJpbnRfbWF0cml4X2R5bmFtaWMyKGludCAqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIGZyZWVfbWF0cml4X2R5bmFtaWMyKGludCAqbWF0cml4KTsKCmludCoqIGFsbG9jYXRlX21hdHJpeF9keW5hbWljMyhpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIHJlYWRfbWF0cml4X2R5bmFtaWMzKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCBwcmludF9tYXRyaXhfZHluYW1pYzMoaW50ICoqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIGZyZWVfbWF0cml4X2R5bmFtaWMzKGludCAqKm1hdHJpeCwgaW50IHJvd3MpOwoKaW50IG1haW4oKSB7CiAgICBpbnQgY2hvaWNlLCByb3dzLCBjb2xzOwogICAgcHJpbnRmKCLQktGL0LHQtdGA0LjRgtC1INC80LXRgtC+0LQg0LLRi9C00LXQu9C10L3QuNGPINC/0LDQvNGP0YLQuDpcbjEuINCh0YLQsNGC0LjRh9C10YHQutC4XG4yLiDQlNC40L3QsNC80LjRh9C10YHQutC4ICgyRCDQvNCw0YHRgdC40LIg0YPQutCw0LfQsNGC0LXQu9C10LkpXG4zLiDQlNC40L3QsNC80LjRh9C10YHQutC4ICgxRCDQvNCw0YHRgdC40LIpXG40LiDQlNC40L3QsNC80LjRh9C10YHQutC4ICjQvNCw0YHRgdC40LIg0YPQutCw0LfQsNGC0LXQu9C10Lkg0L3QsCDRgdGC0YDQvtC60LgpXG4iKTsKICAgIAogICAgaWYgKHNjYW5mKCIlZCIsICZjaG9pY2UpICE9IDEgfHwgY2hvaWNlIDwgMSB8fCBjaG9pY2UgPiA0KSB7CiAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgIHJldHVybiAxOyAvLyDQntGI0LjQsdC60LAg0LLRi9Cx0L7RgNCwCiAgICB9CiAgICAKICAgIC8vINCn0YLQtdC90LjQtSDRgNCw0LfQvNC10YDQvtCyINC80LDRgtGA0LjRhtGLCiAgICBpZiAoc2NhbmYoIiVkICVkIiwgJnJvd3MsICZjb2xzKSAhPSAyIHx8IHJvd3MgPCAxIHx8IGNvbHMgPCAxIHx8IHJvd3MgPiBNQVhfU0laRSB8fCBjb2xzID4gTUFYX1NJWkUpIHsKICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0YHRh9C40YLRi9Cy0LDQvdC40Lgg0YDQsNC30LzQtdGA0L7QsiDQvNCw0YLRgNC40YbRiwogICAgfQoKICAgIHN3aXRjaCAoY2hvaWNlKSB7CiAgICAgICAgY2FzZSAxOiB7CiAgICAgICAgICAgIGludCBtYXRyaXhbTUFYX1NJWkVdW01BWF9TSVpFXTsKICAgICAgICAgICAgcmVhZF9tYXRyaXhfc3RhdGljKG1hdHJpeCwgcm93cywgY29scyk7CiAgICAgICAgICAgIHByaW50X21hdHJpeF9zdGF0aWMobWF0cml4LCByb3dzLCBjb2xzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgMjogewogICAgICAgICAgICBpbnQgKiptYXRyaXggPSBhbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzEocm93cywgY29scyk7CiAgICAgICAgICAgIGlmIChtYXRyaXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0LLRi9C00LXQu9C10L3QuNC4INC/0LDQvNGP0YLQuAogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlYWRfbWF0cml4X2R5bmFtaWMxKG1hdHJpeCwgcm93cywgY29scyk7CiAgICAgICAgICAgIHByaW50X21hdHJpeF9keW5hbWljMShtYXRyaXgsIHJvd3MsIGNvbHMpOwogICAgICAgICAgICBmcmVlX21hdHJpeF9keW5hbWljMShtYXRyaXgsIHJvd3MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAzOiB7CiAgICAgICAgICAgIGludCAqbWF0cml4ID0gYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMyKHJvd3MsIGNvbHMpOwogICAgICAgICAgICBpZiAobWF0cml4ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50Zigibi9hXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAxOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INCy0YvQtNC10LvQtdC90LjQuCDQv9Cw0LzRj9GC0LgKICAgICAgICAgICAgfQogICAgICAgICAgICByZWFkX21hdHJpeF9keW5hbWljMihtYXRyaXgsIHJvd3MsIGNvbHMpOwogICAgICAgICAgICBwcmludF9tYXRyaXhfZHluYW1pYzIobWF0cml4LCByb3dzLCBjb2xzKTsKICAgICAgICAgICAgZnJlZV9tYXRyaXhfZHluYW1pYzIobWF0cml4KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgNDogewogICAgICAgICAgICBpbnQgKiptYXRyaXggPSBhbGxvY2F0ZV9tYXRyaXhfZHluYW1pYzMocm93cywgY29scyk7CiAgICAgICAgICAgIGlmIChtYXRyaXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0LLRi9C00LXQu9C10L3QuNC4INC/0LDQvNGP0YLQuAogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlYWRfbWF0cml4X2R5bmFtaWMzKG1hdHJpeCwgcm93cywgY29scyk7CiAgICAgICAgICAgIHByaW50X21hdHJpeF9keW5hbWljMyhtYXRyaXgsIHJvd3MsIGNvbHMpOwogICAgICAgICAgICBmcmVlX21hdHJpeF9keW5hbWljMyhtYXRyaXgsIHJvd3MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8vINCn0YLQtdC90LjQtSDRgdGC0LDRgtC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLCnZvaWQgcmVhZF9tYXRyaXhfc3RhdGljKGludCBtYXRyaXhbTUFYX1NJWkVdW01BWF9TSVpFXSwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIGlmIChzY2FuZigiJWQiLCAmbWF0cml4W2ldW2pdKSAhPSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgICAgICAgICBleGl0KDEpOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INGB0YfQuNGC0YvQstCw0L3QuNC4CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8vINCf0LXRh9Cw0YLRjCDRgdGC0LDRgtC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLCnZvaWQgcHJpbnRfbWF0cml4X3N0YXRpYyhpbnQgbWF0cml4W01BWF9TSVpFXVtNQVhfU0laRV0sIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBwcmludGYoIiVkIiwgbWF0cml4W2ldW2pdKTsKICAgICAgICAgICAgaWYgKGogPCBjb2xzIC0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGkgPCByb3dzIC0gMSkgewogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQp9CgovLyDQlNC40L3QsNC80LjRh9C10YHQutC+0LUg0LLRi9C00LXQu9C10L3QuNC1OiAyRCDQvNCw0YHRgdC40LIg0YPQutCw0LfQsNGC0LXQu9C10LkKaW50KiogYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMxKGludCByb3dzLCBpbnQgY29scykgewogICAgaW50ICoqbWF0cml4ID0gbWFsbG9jKHJvd3MgKiBzaXplb2YoaW50KikpOwogICAgaWYgKG1hdHJpeCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIG1hdHJpeFtpXSA9IG1hbGxvYyhjb2xzICogc2l6ZW9mKGludCkpOwogICAgICAgIGlmIChtYXRyaXhbaV0gPT0gTlVMTCkgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewogICAgICAgICAgICAgICAgZnJlZShtYXRyaXhbal0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyZWUobWF0cml4KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hdHJpeDsKfQoKLy8g0KfRgtC10L3QuNC1INC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAxCnZvaWQgcmVhZF9tYXRyaXhfZHluYW1pYzEoaW50ICoqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgaWYgKHNjYW5mKCIlZCIsICZtYXRyaXhbaV1bal0pICE9IDEpIHsKICAgICAgICAgICAgICAgIHByaW50Zigibi9hXG4iKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0YHRh9C40YLRi9Cy0LDQvdC40LgKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLy8g0J/QtdGH0LDRgtGMINC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAxCnZvaWQgcHJpbnRfbWF0cml4X2R5bmFtaWMxKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQiLCBtYXRyaXhbaV1bal0pOwogICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaSA8IHJvd3MgLSAxKSB7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9Cn0KCi8vINCe0YHQstC+0LHQvtC20LTQtdC90LjQtSDQv9Cw0LzRj9GC0Lgg0LTQu9GPINC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAxCnZvaWQgZnJlZV9tYXRyaXhfZHluYW1pYzEoaW50ICoqbWF0cml4LCBpbnQgcm93cykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmcmVlKG1hdHJpeFtpXSk7CiAgICB9CiAgICBmcmVlKG1hdHJpeCk7Cn0KCi8vINCU0LjQvdCw0LzQuNGH0LXRgdC60L7QtSDQstGL0LTQtdC70LXQvdC40LU6IDFEINC80LDRgdGB0LjQsgppbnQqIGFsbG9jYXRlX21hdHJpeF9keW5hbWljMihpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIHJldHVybiBtYWxsb2Mocm93cyAqIGNvbHMgKiBzaXplb2YoaW50KSk7Cn0KCi8vINCn0YLQtdC90LjQtSDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMgp2b2lkIHJlYWRfbWF0cml4X2R5bmFtaWMyKGludCAqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgaWYgKHNjYW5mKCIlZCIsICZtYXRyaXhbaSAqIGNvbHMgKyBqXSkgIT0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJuL2FcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDQn9C10YfQsNGC0Ywg0LTQuNC90LDQvNC40YfQtdGB0LrQvtC5INC80LDRgtGA0LjRhtGLIDIKdm9pZCBwcmludF9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBwcmludGYoIiVkIiwgbWF0cml4W2kgKiBjb2xzICsgal0pOwogICAgICAgICAgICBpZiAoaiA8IGNvbHMgLSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaSA8IHJvd3MgLSAxKSB7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9Cn0KCi8vINCe0YHQstC+0LHQvtC20LTQtdC90LjQtSDQv9Cw0LzRj9GC0Lgg0LTQu9GPINC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiyAyCnZvaWQgZnJlZV9tYXRyaXhfZHluYW1pYzIoaW50ICptYXRyaXgpIHsKICAgIGZyZWUobWF0cml4KTsKfQoKLy8g0JTQuNC90LDQvNC40YfQtdGB0LrQvtC1INCy0YvQtNC10LvQtdC90LjQtTog0LzQsNGB0YHQuNCyINGD0LrQsNC30LDRgtC10LvQtdC5INC90LAg0YHRgtGA0L7QutC4CmludCoqIGFsbG9jYXRlX21hdHJpeF9keW5hbWljMyhpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGludCAqKm1hdHJpeCA9IG1hbGxvYyhyb3dzICogc2l6ZW9mKGludCopKTsKICAgIGlmIChtYXRyaXggPT0gTlVMTCkgcmV0dXJuIE5VTEw7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBtYXRyaXhbaV0gPSBtYWxsb2MoY29scyAqIHNpemVvZihpbnQpKTsKICAgICAgICBpZiAobWF0cml4W2ldID09IE5VTEwpIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKICAgICAgICAgICAgICAgIGZyZWUobWF0cml4W2pdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKG1hdHJpeCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRyaXg7Cn0KCi8vINCn0YLQtdC90LjQtSDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMwp2b2lkIHJlYWRfbWF0cml4X2R5bmFtaWMzKGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIGlmIChzY2FuZigiJWQiLCAmbWF0cml4W2ldW2pdKSAhPSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIm4vYVxuIik7CiAgICAgICAgICAgICAgICBleGl0KDEpOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INGB0YfQuNGC0YvQstCw0L3QuNC4CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8vINCf0LXRh9Cw0YLRjCDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMwp2b2lkIHByaW50X21hdHJpeF9keW5hbWljMyhpbnQgKiptYXRyaXgsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBwcmludGYoIiVkIiwgbWF0cml4W2ldW2pdKTsKICAgICAgICAgICAgaWYgKGogPCBjb2xzIC0gMSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGkgPCByb3dzIC0gMSkgewogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQp9CgovLyDQntGB0LLQvtCx0L7QttC00LXQvdC40LUg0L/QsNC80Y/RgtC4INC00LvRjyDQtNC40L3QsNC80LjRh9C10YHQutC+0Lkg0LzQsNGC0YDQuNGG0YsgMwp2b2lkIGZyZWVfbWF0cml4X2R5bmFtaWMzKGludCAqKm1hdHJpeCwgaW50IHJvd3MpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZnJlZShtYXRyaXhbaV0pOwogICAgfQogICAgZnJlZShtYXRyaXgpOwp9