#include <iostream>
using namespace std;
// 1) що негаразд із кодом з погляду інкапсуляції? Як виправити?
// 2) додайте можливість виклику конструктора без параметрів, щоб створювалася матриця розміру 1Х1
//3) реалізувати деструктор
// 4) перевантажити операцію + додавання 2х матриць
// 5) перевантажити операцію - віднімання 2х матриць
// 6) обробити створення матриці з негативною розмірністю
// 7)перевантажити операцію * множення матриці на матрицю
// 9) написати клас спадкоємець квадратна матриця, з методом обчислює слід матриці (сума елементів головної діаганалі)

template <typename T>
class Matrix
{
	public:
	T **a;
	int size1;
	
	int size2;
	Matrix(int n, int m) : size1(n), size2(m){
		a = new T * [n];    
		for (int i = 0; i < n; i++){
			a[i] = new T [m];
		}
  }
  T* operator [](const int i) {return a[i];}
  	Matrix operator+(const Matrix& lhs)const{
  		Matrix c(size1,size2);
		 for(int i=0;i<size1;i++){
		 	for(int j=0;j<size2;j++){
		 		c.a[i][j]=a[i][j]+lhs.a[i][j];
		 }
		 }
		return c;
		 }
		 	friend	ostream& operator<< (ostream& os, const Matrix& a)  {  
//	  countT++;
		for(int i=0;i<a.size1;i++){
			for(int j=0;j<a.size2;j++){
				os<<a.a[i][j]<<" ";
			}
			os<<endl;
		}
    	return os;
	}
 	friend	istream& operator>> (istream& is, const Matrix& a)  {  
//	  countT++;
		for(int i=0;i<a.size1;i++){
			for(int j=0;j<a.size2;j++){
				is>>a.a[i][j];
			}
		}
    	return is;
	}
 
};

int main(void)
{
  Matrix<double> a(2,2);
  cin>>a;
  Matrix<double> b(2,2);
  cin>>b;
  Matrix<double> c(2,2);
  c=a+b;
  cout<<c;
  return 0;
}

