#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, const  Matrix*  matrix) : 
            i( i) ,
            matrix( const_cast < Matrix* > ( matrix) ) 
        { 
        	std:: cout  <<  "int ctor"  <<  std:: endl ; 
        } 
        Row( int  i, Matrix*  matrix) : 
            i( i) ,
            matrix( matrix) 
        { 
        	std:: cout  <<  "int ctor"  <<  std:: endl ; 
        } 
        Row( ) 
        { 
            std:: cout  <<  "ctor"  <<  std:: endl ; 
        } 
        Row( const  Row& ) 
        { 
            std:: cout  <<  "copy ctor"  <<  std:: endl ; 
        } 
        Row&  operator= ( const  Row& ) 
        { 
            std:: cout  <<  "assign lvalue"  <<  std:: endl ; 
        } 
        Row( Row&& ) 
        { 
            std:: cout  <<  "move ctor"  <<  std:: endl ; 
        } 
        Row&  operator= ( Row&& ) 
        { 
            std:: cout  <<  "assign rvalue"  <<  std:: endl ; 
        } 
    } ; 
public : 
    Matrix( ) : 
        m( 0 ) ,
        n( 0 ) 
    { } 
    explicit  Matrix( size_t  m, size_t  n) : 
        m( m) ,
        n( n) ,
        mappedVector( m* n) 
    { } 
    Matrix( const  Matrix&  rhs) : 
        m( rhs.m ) ,
        n( rhs.n ) ,
        mappedVector( rhs.mappedVector ) 
    { } 
    Matrix&  operator= ( const  Matrix&  rhs) 
    { 
        if ( & rhs ! =  this ) 
        { 
            m =  rhs.m ; 
            n =  rhs.m ; 
            mappedVector.resize ( rhs.mappedVector .size ) ; 
            mappedVector =  rhs.mappedVector ; 
        } 
    } 
    Matrix( Matrix&&  rhs) : 
        m( std:: exchange ( rhs.m , 0 ) ) ,
        n( std:: exchange ( rhs.n , 0 ) ) ,
        mappedVector( std:: exchange ( rhs.mappedVector , { } ) ) 
    { } 
    Matrix&  operator= ( Matrix&&  rhs) 
    { 
        if ( & rhs ! =  this ) 
        { 
            m =  std:: exchange ( rhs.m , 0 ) ; 
            n =  std:: exchange ( rhs.n , 0 ) ; 
            mappedVector =  std:: exchange ( rhs.mappedVector , { } ) ; 
        } 
    } 
    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+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBNYXRyaXgKewpwcml2YXRlOgogICAgY2xhc3MgUm93CiAgICB7CiAgICBmcmllbmQgY2xhc3MgTWF0cml4OwoKICAgIHB1YmxpYzoKICAgICAgICBUJiBvcGVyYXRvcltdIChpbnQgaikgJiYKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBtYXRyaXgtPm1hcHBlZFZlY3RvcltpICogbWF0cml4LT5uICsgal07CiAgICAgICAgfQogICAgICAgIGNvbnN0IFQmIG9wZXJhdG9yW10gKGludCBqKSBjb25zdCAmJgogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG1hdHJpeC0+bWFwcGVkVmVjdG9yW2kgKiBtYXRyaXgtPm4gKyBqXTsKICAgICAgICB9CiAgICBwcml2YXRlOgogICAgICAgIGludCBpOwogICAgICAgIE1hdHJpeCogbWF0cml4OwoKICAgICAgICBSb3coaW50IGksIGNvbnN0IE1hdHJpeCogbWF0cml4KToKICAgICAgICAgICAgaShpKSwKICAgICAgICAgICAgbWF0cml4KGNvbnN0X2Nhc3Q8TWF0cml4Kj4obWF0cml4KSkKICAgICAgICB7CiAgICAgICAgCXN0ZDo6Y291dCA8PCAiaW50IGN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9CiAgICAgICAgUm93KGludCBpLCBNYXRyaXgqIG1hdHJpeCk6CiAgICAgICAgICAgIGkoaSksCiAgICAgICAgICAgIG1hdHJpeChtYXRyaXgpCiAgICAgICAgewogICAgICAgIAlzdGQ6OmNvdXQgPDwgImludCBjdG9yIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIFJvdygpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9CiAgICAgICAgUm93KGNvbnN0IFJvdyYpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImNvcHkgY3RvciIgPDwgc3RkOjplbmRsOwogICAgICAgIH0KICAgICAgICBSb3cmIG9wZXJhdG9yPShjb25zdCBSb3cmKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJhc3NpZ24gbHZhbHVlIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIFJvdyhSb3cmJikKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAibW92ZSBjdG9yIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIFJvdyYgb3BlcmF0b3I9KFJvdyYmKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJhc3NpZ24gcnZhbHVlIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgfTsKcHVibGljOgogICAgTWF0cml4KCk6CiAgICAgICAgbSgwKSwKICAgICAgICBuKDApCiAgICB7fQogICAgZXhwbGljaXQgTWF0cml4KHNpemVfdCBtLCBzaXplX3Qgbik6CiAgICAgICAgbShtKSwKICAgICAgICBuKG4pLAogICAgICAgIG1hcHBlZFZlY3RvcihtKm4pCiAgICB7fQogICAgTWF0cml4KGNvbnN0IE1hdHJpeCYgcmhzKToKICAgICAgICBtKHJocy5tKSwKICAgICAgICBuKHJocy5uKSwKICAgICAgICBtYXBwZWRWZWN0b3IocmhzLm1hcHBlZFZlY3RvcikKICAgIHt9CiAgICBNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBNYXRyaXgmIHJocykKICAgIHsKICAgICAgICBpZigmcmhzICE9IHRoaXMpCiAgICAgICAgewogICAgICAgICAgICBtID0gcmhzLm07CiAgICAgICAgICAgIG4gPSByaHMubTsKICAgICAgICAgICAgbWFwcGVkVmVjdG9yLnJlc2l6ZShyaHMubWFwcGVkVmVjdG9yLnNpemUpOwogICAgICAgICAgICBtYXBwZWRWZWN0b3IgPSByaHMubWFwcGVkVmVjdG9yOwogICAgICAgIH0KICAgIH0KICAgIE1hdHJpeChNYXRyaXgmJiByaHMpOgogICAgICAgIG0oc3RkOjpleGNoYW5nZShyaHMubSwgMCkpLAogICAgICAgIG4oc3RkOjpleGNoYW5nZShyaHMubiwgMCkpLAogICAgICAgIG1hcHBlZFZlY3RvcihzdGQ6OmV4Y2hhbmdlKHJocy5tYXBwZWRWZWN0b3IsIHt9KSkKICAgIHt9CiAgICBNYXRyaXgmIG9wZXJhdG9yPShNYXRyaXgmJiByaHMpCiAgICB7CiAgICAgICAgaWYoJnJocyAhPSB0aGlzKQogICAgICAgIHsKICAgICAgICAgICAgbSA9IHN0ZDo6ZXhjaGFuZ2UocmhzLm0sIDApOwogICAgICAgICAgICBuID0gc3RkOjpleGNoYW5nZShyaHMubiwgMCk7CiAgICAgICAgICAgIG1hcHBlZFZlY3RvciA9IHN0ZDo6ZXhjaGFuZ2UocmhzLm1hcHBlZFZlY3Rvciwge30pOwogICAgICAgIH0KICAgIH0KICAgIFJvdyBvcGVyYXRvcltdIChpbnQgaSkKICAgIHsKICAgICAgICByZXR1cm4gUm93KGksIHRoaXMpOwogICAgfQogICAgY29uc3QgUm93IG9wZXJhdG9yW10gKGludCBpKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBSb3coaSwgdGhpcyk7CiAgICB9CnByaXZhdGU6CiAgICBzaXplX3QgbTsKICAgIHNpemVfdCBuOwogICAgc3RkOjp2ZWN0b3I8VD4gbWFwcGVkVmVjdG9yOwp9OwoKaW50IG1haW4oKQp7CglNYXRyaXg8aW50PiBtYXRyaXgoMiwgNSk7CiAgICBtYXRyaXhbMV1bMF0gPSAxOwogICAgCiAgICBhdXRvIGF1dG9Sb3dQcm94eSA9IG1hdHJpeFsxXTsKICAgIAoJcmV0dXJuIDA7Cn0=