#include <iostream>
#include <algorithm>
using namespace std;

template<typename Item>
class matrix
{
public:
	matrix(size_t sx, size_t sy)
		: _sx(sx), _sy(sy), items(nullptr)
	{
		items = new Item[sx * sy];
		fill(items, items + sx * sy, 0);
		for (size_t xy = 0; xy < min(sx, sy); xy++) (*this)(xy, xy) = 1;
	}

	~matrix() { delete[] items; }
	size_t sx() const { return _sx; }
	size_t sy() const { return _sy; }

	const Item& operator()(size_t x, size_t y) const { return items[y * _sx + x]; }
	Item& operator()(size_t x, size_t y) { return items[y * _sx + x]; }

private:
	size_t _sx, _sy;
	Item* items;
};

template<typename Item>
ostream& operator <<(ostream& strm, const matrix<Item>& m)
{
	for (size_t y = 0; y < m.sy(); y++)
		for (size_t x = 0; x < m.sx(); x++)
			(x > 0 ? strm << " " : (y > 0 ? strm << endl : strm)) << m(x, y);
	return strm;
}

int main()
{
	matrix<double> m(5, 5);
	m(3, 1) = 7;
	cout << m << endl;
	return 0;
}