/* цей код написано користувачем Koala форуму replace.org.ua. Відтворення і 
використання цілком або частинами дозволяється виключно за умови надання в гілку
http://r...content-available-to-author-only...g.ua/topic/9417/ відеостріма зі здачі цього коду замовнику/викладачу */

#include <iostream>
#include <vector>
#include <random>
#include <algorithm>

int main() {
	int width, height;
	std::cout<<"Введіть через пробіл кількість рядків і стовбчиків: ";
	std::cin>>height>>width;
	std::vector<std::vector<int>> matrix(height);
	
	std::default_random_engine generator;
	std::uniform_int_distribution<int> distribution(-20,20);	
	std::generate(matrix.begin(),matrix.end(),[&](){
		std::vector<int> line(width);
		std::generate(line.begin(),line.end(),[&](){return distribution(generator);});
		return line;
	});
	
	std::cout<<"Початкова матриця:\n";
	std::for_each(matrix.begin(),matrix.end(),[&](std::vector<int> & line){
		std::for_each(line.begin(),line.end(),[&](int x){std::cout<<x<<" ";});
		std::cout<<"\n";
	});
	
	auto min_line = std::min_element(matrix.begin(),matrix.end(),
	              [](std::vector<int> & left, std::vector<int> & right){
	            		return *std::min_element(left.begin(),left.end()) < *std::min_element(right.begin(),right.end());
	              });
	std::swap(*min_element(min_line->begin(), min_line->end()),matrix[height-1][0]);
	
	auto max_line = std::max_element(matrix.begin(),matrix.end(),
	              [](std::vector<int> & left, std::vector<int> & right){
	            		return *std::max_element(left.begin(),left.end()) < *std::max_element(right.begin(),right.end());
	              });
	std::swap(*std::max_element(max_line->begin(), max_line->end()),matrix[0][width-1]);

	std::cout<<"Матриця після обмінів:\n";
	std::for_each(matrix.begin(),matrix.end(),[&](std::vector<int> & line){
		std::for_each(line.begin(),line.end(),[&](int x){std::cout<<x<<" ";});
		std::cout<<"\n";
	});
	return 0;
}