#include <iostream>

using namespace std;

int main(){
	int rows, cols; // строки и столбцы матрицы

	// ввод размера матрицы
	cout << "Input rows of matrix: " << endl;
	cin >> rows;

	cout << "Input cols of matrix: " << endl;
	cin >> cols;

	if ((rows < 1) || (cols < 1)){
		cout << "Size cannot be less than 1.";
		return 0;
	}

    int **matrix = new int *[rows]; //матрица
	for (int i = 0; i < rows; i++){
		matrix[i] = new int [cols];
	}


	cout << "Input matrix's elements:" << endl;
	// ввод матрицы
    for (int i = 0; i < rows; i++){
		for (int j = 0; j < cols; j++){
            cin >> matrix[i][j];
        }
	}

	cout << "-------------" << endl;
	// вывод матрицы
	for (int i = 0; i < rows; i++){
		for (int j = 0; j < cols; j++){
			cout << matrix[i][j] << "\t";
        }
		cout << endl;
	}

	int **sorted_matrix = new int *[rows];
	for (int i = 0; i < rows; i++){
		sorted_matrix[i] = new int [cols];
	}

	for (int i = 0; i < rows; i++){
		for (int j = 0; j < cols; j++){
			sorted_matrix[i][j] = matrix[i][j];
		}
	}

	cout << "-------------" << endl;
	// сортировка матрицы методом пузырька
	for (int i = 0; i < cols; i++){
		for (int j = 0; j < rows; j++){
			for (int k = 0; k < rows - 1; k++){
				if (sorted_matrix[k][i] > sorted_matrix[k + 1][i]){ // если элемент справа меньше текущего, то
					swap(sorted_matrix[k][i], sorted_matrix[k + 1][i]); // меняем их местами
				}
			}
        }
	}
	
	// вывод матрицы
	for (int i = 0; i < rows; i++){
		for (int j = 0; j < cols; j++){
			cout << sorted_matrix[i][j] << "\t";
        }
		cout << endl;
	}

	// Очистка ОЗУ
	for (int i = 0; i < rows; i++){
		delete[] matrix[i];
		delete[] sorted_matrix[i];
	}

	delete[] matrix;
	delete[] sorted_matrix;
    
	return 0;
}
