#include <iostream>
#include <vector>
#include <string> 

class Matrix {
	std::vector<std::vector<std::string>> m;
public:
	Matrix(int x = 0, int y = 0) {
		m.resize(x);
		for (int i = 0; i < x; ++i)
			m[i].resize(y);
	}

	void print() const {
		for(size_t i = 0; i < m.size(); ++i) {
			for (size_t j = 0; j < m[i].size(); ++j) {
				std::cout << '[' << m[i][j] << ']';
			}
			std::cout << std::endl;
		}
	}

	class Proxy {
		std::vector<std::string> &mm;
	public:
		Proxy(std::vector<std::string> &s) : mm(s) {}

		std::string& operator[](int index) {
			return mm[index];
		}
	};

	Proxy operator[](int index) {
		return Proxy(m[index]);
	}
};

int main()
{
	Matrix m(5, 5);
	m.print();
	std::cout << std::endl;
	
	m[2][2] = "It Works";
	std::cout << m[2][2] << std::endl;
	m.print();
	std::cout << std::endl;

	Matrix m2(m);
	std::cout << m2[2][2] << std::endl;
	m2.print();
	std::cout << std::endl;
	
	Matrix m3;
	m3 = m2;
	std::cout << m3[2][2] << std::endl;
	m3.print();

	return 0;
}