#include <iostream>
#include <vector>
#include <cassert>
using namespace std;
template<typename T,int Roz>
class Matrix
{
public:
T tab[Roz][Roz];
int z;
Matrix()
{
z=Roz;
for(int i=0;i<Roz;++i)
for(int j=0;j<Roz;++j)
tab[i][j]=0;
}
T& operator()(int x,int y){
return tab[x-1][y-1];
}
template <typename T2, int W>
Matrix operator+(const Matrix<T2,W>& b)
{
assert(b.z == Roz && this->z == Roz);
Matrix<T2,Roz> tmp;
for(int i=0;i<Roz;++i)
for(int j=0;j<Roz;++j)
tmp.tab[i][j]=this->tab[i][j]+b.tab[i][j];
return tmp;
}
template <typename T2, int W>
Matrix& operator=(const Matrix<T2,W>& b)
{
if(&b != this) {
assert(Roz == W);
for(int i=0;i<Roz;++i)
for(int j=0;j<Roz;++j)
this->tab[i][j] = b.tab[i][j];
}
return *this;
}
Matrix& operator*(Matrix<T,Roz> b)
{
Matrix<T,Roz> tmp;
for(int i=0;i<Roz;++i)
for(int j=0;j<Roz;++j)
tmp.tab[i][j]=this->tab[i][j]+b.tab[i][j];
}
friend ostream& operator<<(ostream& out, Matrix<T,Roz> &v)
{
for(int i=0;i<v.z;++i)
{
for(int j=0;j<v.z;++j)
out<<v.tab[i][j]<<" ";
out<<endl;
}
return out;
}
};
template<class T>
class Matrix<T,0>
{
private:
Matrix()
{
z=0;
}
public:
vector<vector<T> > tab;
int z;
Matrix(int z)
{
z = z;
for(int i=0;i<z;++i)
tab.push_back(vector<T>(z));
this->z = z;
for(int i=0;i<z;++i)
for(int j=0;j<z;++j)
tab[i][j]=0;
}
T& operator()(int x,int y){
return tab[x-1][y-1];
}
Matrix& operator+(Matrix<T,0> b)
{
Matrix<T,0> tmp(b.z);
for(int i=0;i<z;++i)
for(int j=0;j<z;++j)
tmp.tab[i][j]=this->tab[i][j]+b.tab[i][j];
}
Matrix& operator+(Matrix<T,0> &b)
{
Matrix<T,0> tmp(b.z);
for(int i=0;i<z;++i)
for(int j=0;j<z;++j)
tmp.tab[i][j]=this->tab[i][j]+b.tab[i][j];
}
friend ostream& operator<<(ostream& out, Matrix<T,0> &v)
{
for(int i=0;i<v.z;++i)
{
for(int j=0;j<v.z;++j)
out<<v.tab[i][j]<<" ";
out<<endl;
}
return out;
}
};
int main()
{
Matrix<int,3> A;
Matrix<int, 0> Z(3);
Matrix<int, 3> Y;
A(1,1)=1;
Z(1,1)=1;
std::cout << A << std::endl;
std::cout << Z << std::endl;
std::cout << Y << std::endl;
Y = A + Z;
std::cout << Y << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y2Fzc2VydD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdGVtcGxhdGU8dHlwZW5hbWUgVCxpbnQgUm96PgpjbGFzcyBNYXRyaXgKewpwdWJsaWM6CiAgICBUIHRhYltSb3pdW1Jvel07CiAgICBpbnQgejsKICAgIE1hdHJpeCgpCiAgICB7CiAgICAgICAgej1Sb3o7CiAgICAgICAgZm9yKGludCBpPTA7aTxSb3o7KytpKQogICAgICAgICAgIGZvcihpbnQgaj0wO2o8Um96OysraikKICAgICAgICAgICAgICB0YWJbaV1bal09MDsKICAgIH0KICAgIFQmIG9wZXJhdG9yKCkoaW50IHgsaW50IHkpewogICAgICAgIHJldHVybiB0YWJbeC0xXVt5LTFdOwogICAgfQogCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDIsIGludCBXPgogICAgTWF0cml4IG9wZXJhdG9yKyhjb25zdCBNYXRyaXg8VDIsVz4mIGIpCiAgICB7CiAgICAgICAgYXNzZXJ0KGIueiA9PSBSb3ogJiYgdGhpcy0+eiA9PSBSb3opOwogICAgICAgIE1hdHJpeDxUMixSb3o+IHRtcDsKICAgICAgICBmb3IoaW50IGk9MDtpPFJvejsrK2kpCiAgICAgICAgICAgZm9yKGludCBqPTA7ajxSb3o7KytqKQogICAgICAgICAgICAgIHRtcC50YWJbaV1bal09dGhpcy0+dGFiW2ldW2pdK2IudGFiW2ldW2pdOwogICAgICAgIHJldHVybiB0bXA7CiAgICB9CiAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMiwgaW50IFc+CiAgICBNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBNYXRyaXg8VDIsVz4mIGIpCiAgICB7CiAgICAgICAgaWYoJmIgIT0gdGhpcykgewogICAgICAgICAgIGFzc2VydChSb3ogPT0gVyk7CiAKICAgICAgICAgICBmb3IoaW50IGk9MDtpPFJvejsrK2kpCiAgICAgICAgICAgICAgZm9yKGludCBqPTA7ajxSb3o7KytqKQogICAgICAgICAgICAgICAgICB0aGlzLT50YWJbaV1bal0gPSBiLnRhYltpXVtqXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogCiAgICBNYXRyaXgmIG9wZXJhdG9yKihNYXRyaXg8VCxSb3o+IGIpCiAgICB7CiAgICAgICAgIE1hdHJpeDxULFJvej4gdG1wOwogICAgICAgICBmb3IoaW50IGk9MDtpPFJvejsrK2kpCiAgICAgICAgICAgICBmb3IoaW50IGo9MDtqPFJvejsrK2opCiAgICAgICAgICAgICAgICB0bXAudGFiW2ldW2pdPXRoaXMtPnRhYltpXVtqXStiLnRhYltpXVtqXTsgCiAgICB9CiAKICAgIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG91dCwgTWF0cml4PFQsUm96PiAmdikKICAgIHsKICAgICAgICAgZm9yKGludCBpPTA7aTx2Lno7KytpKQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IoaW50IGo9MDtqPHYuejsrK2opCiAgICAgICAgICAgICAgICBvdXQ8PHYudGFiW2ldW2pdPDwiICI7CiAgICAgICAgICAgICBvdXQ8PGVuZGw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gb3V0OwogICAgfQp9OwogCiAKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgTWF0cml4PFQsMD4Kewpwcml2YXRlOgogICAgIE1hdHJpeCgpCiAgICB7CiAgICAgICAgej0wOwogICAgfQpwdWJsaWM6CiAgICB2ZWN0b3I8dmVjdG9yPFQ+ID4gdGFiOwogICAgaW50IHo7CiAKICAgIE1hdHJpeChpbnQgeikKICAgIHsKICAgICAgICB6ID0gejsKICAgICAgICBmb3IoaW50IGk9MDtpPHo7KytpKQogICAgICAgICAgICB0YWIucHVzaF9iYWNrKHZlY3RvcjxUPih6KSk7CiAgICAgICAgdGhpcy0+eiA9IHo7CiAgICAgICAgZm9yKGludCBpPTA7aTx6OysraSkKICAgICAgICAgICAgICAgIGZvcihpbnQgaj0wO2o8ejsrK2opCiAgICAgICAgICAgICAgICAgICAgdGFiW2ldW2pdPTA7CiAgICB9CiAgICBUJiBvcGVyYXRvcigpKGludCB4LGludCB5KXsKICAgICAgICByZXR1cm4gdGFiW3gtMV1beS0xXTsKICAgIH0KIAogICAgTWF0cml4JiBvcGVyYXRvcisoTWF0cml4PFQsMD4gYikKICAgIHsKICAgICAgICAgICAgTWF0cml4PFQsMD4gdG1wKGIueik7CiAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8ejsrK2kpCiAgICAgICAgICAgICAgICBmb3IoaW50IGo9MDtqPHo7KytqKQogICAgICAgICAgICAgICAgICAgIHRtcC50YWJbaV1bal09dGhpcy0+dGFiW2ldW2pdK2IudGFiW2ldW2pdOwogCiAKICAgIH0KIAogICAgIE1hdHJpeCYgb3BlcmF0b3IrKE1hdHJpeDxULDA+ICZiKQogICAgewogICAgICAgICAgICBNYXRyaXg8VCwwPiB0bXAoYi56KTsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTx6OysraSkKICAgICAgICAgICAgICAgIGZvcihpbnQgaj0wO2o8ejsrK2opCiAgICAgICAgICAgICAgICAgICAgdG1wLnRhYltpXVtqXT10aGlzLT50YWJbaV1bal0rYi50YWJbaV1bal07CiAKICAgIH0KIAogCiAKICAgIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG91dCwgTWF0cml4PFQsMD4gJnYpCiAgICB7CiAKICAgICAgICAgICAgZm9yKGludCBpPTA7aTx2Lno7KytpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaj0wO2o8di56OysraikKICAgICAgICAgICAgICAgICAgICAgICAgb3V0PDx2LnRhYltpXVtqXTw8IiAiOwogCiAgICAgICAgICAgICAgICAgICAgb3V0PDxlbmRsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb3V0OwogICAgfQp9OwogCiAKaW50IG1haW4oKQp7CiAgICBNYXRyaXg8aW50LDM+IEE7CiAgICBNYXRyaXg8aW50LCAwPiBaKDMpOwogICAgTWF0cml4PGludCwgMz4gWTsKICAgIEEoMSwxKT0xOwogICAgWigxLDEpPTE7CiAgICBzdGQ6OmNvdXQgPDwgQSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgWiA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgWSA8PCBzdGQ6OmVuZGw7CiAKICAgIFkgPSBBICsgWjsKICAgIHN0ZDo6Y291dCA8PCBZIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9