#include <vector>
#include <utility>
#include <iostream>
 
template <typename T>
class Matrix {
 
private:
 
    class Row {
        friend class Matrix;
 
    public:
        T& operator[] (int j)&&
        {
            return matrix.mappedVector[i * matrix.n + j];
        }
        const T& operator[] (int j) const&&
        {
            return matrix.mappedVector[i * matrix.n + j];
        }
    private:
        int i;
        Matrix& matrix;
 
        Row(int i, Matrix& matrix) :  i(i),   matrix(matrix) {
            std::cout << "int ctor" << std::endl;
        }
 
        Row() {
            std::cout << "ctor" << std::endl;
        }
 
    };
public:
    Matrix() :
        m(0),
        n(0)
    {}
    explicit Matrix(size_t m, size_t n) :   m(m),   n(n),   mappedVector(m* n){
    }
 
 
    Row operator[] (int i) {
        return Row(i, *this);
    }
 
    const Row operator[] (int i) const  {
        return Row(i, *this);
    }
 
private:
    size_t m;
    size_t n;
    std::vector<T> mappedVector;
};
 
int main()
{
    Matrix<int> matrix(2, 5);
    matrix[1][0] = 1;
 
    auto autoRowProxy = matrix[1];
 
    return 0;
}
				I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBNYXRyaXggewoKcHJpdmF0ZToKCiAgICBjbGFzcyBSb3cgewogICAgICAgIGZyaWVuZCBjbGFzcyBNYXRyaXg7CgogICAgcHVibGljOgogICAgICAgIFQmIG9wZXJhdG9yW10gKGludCBqKSYmCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbWF0cml4Lm1hcHBlZFZlY3RvcltpICogbWF0cml4Lm4gKyBqXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgVCYgb3BlcmF0b3JbXSAoaW50IGopIGNvbnN0JiYKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBtYXRyaXgubWFwcGVkVmVjdG9yW2kgKiBtYXRyaXgubiArIGpdOwogICAgICAgIH0KICAgIHByaXZhdGU6CiAgICAgICAgaW50IGk7CiAgICAgICAgTWF0cml4JiBtYXRyaXg7CgogICAgICAgIFJvdyhpbnQgaSwgTWF0cml4JiBtYXRyaXgpIDogIGkoaSksICAgbWF0cml4KG1hdHJpeCkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImludCBjdG9yIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQoKICAgICAgICBSb3coKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiY3RvciIgPDwgc3RkOjplbmRsOwogICAgICAgIH0KCiAgICB9OwpwdWJsaWM6CiAgICBNYXRyaXgoKSA6CiAgICAgICAgbSgwKSwKICAgICAgICBuKDApCiAgICB7fQogICAgZXhwbGljaXQgTWF0cml4KHNpemVfdCBtLCBzaXplX3QgbikgOiAgIG0obSksICAgbihuKSwgICBtYXBwZWRWZWN0b3IobSogbil7CiAgICB9CgoKICAgIFJvdyBvcGVyYXRvcltdIChpbnQgaSkgewogICAgICAgIHJldHVybiBSb3coaSwgKnRoaXMpOwogICAgfQoKICAgIGNvbnN0IFJvdyBvcGVyYXRvcltdIChpbnQgaSkgY29uc3QgIHsKICAgICAgICByZXR1cm4gUm93KGksICp0aGlzKTsKICAgIH0KCnByaXZhdGU6CiAgICBzaXplX3QgbTsKICAgIHNpemVfdCBuOwogICAgc3RkOjp2ZWN0b3I8VD4gbWFwcGVkVmVjdG9yOwp9OwoKaW50IG1haW4oKQp7CiAgICBNYXRyaXg8aW50PiBtYXRyaXgoMiwgNSk7CiAgICBtYXRyaXhbMV1bMF0gPSAxOwoKICAgIGF1dG8gYXV0b1Jvd1Byb3h5ID0gbWF0cml4WzFdOwoKICAgIHJldHVybiAwOwp9