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

template<class T>
class Array2D {
	vector<T> data;
	size_t cols;
public:
    template <class U>
    class Array2DIndexer {
    	size_t offset;
    	vector<U> &data;
    public:
        Array2DIndexer(size_t o, vector<U> &dt) : offset(o), data(dt) {}
        T& operator[](size_t index) {
        	return data[offset+index];
        }
    };
    Array2D(size_t r, size_t c) : data (r*c), cols(c) {}
    Array2DIndexer<T> operator[](size_t index) {
    	return Array2DIndexer<T>(index*cols, data);
    }
};

int main() {
	Array2D<int> a2d(10, 20);
	for (int r = 0 ; r != 10 ; r++) {
		for (int c = 0 ; c != 20 ; c++) {
			a2d[r][c] = r+2*c+1;
		}
	}
	for (int r = 0 ; r != 10 ; r++) {
		for (int c = 0 ; c != 20 ; c++) {
			cout << a2d[r][c] << " ";
		}
		cout << endl;
	}
	return 0;
}