#include <iostream>
template<typename T> class Table
{
private:
int width, height, p2;
T *data;
public:
class Column
{
private:
T* & data;
int & x;
int & p2;
public:
Column(T* & data, int & x, int & p2) :data(data), x(x), p2(p2) {}
T & operator[](int y)
{
return data[x + (y<<p2)];
}
};
Table(int width, int height, T fill)
{
this->width = width;
this->height = height;
this->p2 = 32 - __builtin_clz(width - 1);
int len = height * sizeof(T) << p2;
this->data = new T[len];
for (int i = 0; i < len; i++) data[i] = fill;
}
Column operator[](int x)
{
return Column(data, x, p2);
}
};
int main()
{
Table<int> Table(100, 200, 73);
Table[10][20] = 100;
std::cout << Table[9][19] << " " << Table[10][20] << " " << Table[11][21] << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVGFibGUKewpwcml2YXRlOgogICAgaW50IHdpZHRoLCBoZWlnaHQsIHAyOwogICAgVCAqZGF0YTsKcHVibGljOgogICAgY2xhc3MgQ29sdW1uCiAgICB7CiAgICBwcml2YXRlOgogICAgICAgIFQqICYgZGF0YTsKICAgICAgICBpbnQgJiB4OwogICAgICAgIGludCAmIHAyOwogICAgcHVibGljOgogICAgICAgIENvbHVtbihUKiAmIGRhdGEsIGludCAmIHgsIGludCAmIHAyKSA6ZGF0YShkYXRhKSwgeCh4KSwgcDIocDIpIHt9CiAgICAgICAgVCAmIG9wZXJhdG9yW10oaW50IHkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZGF0YVt4ICsgKHk8PHAyKV07CiAgICAgICAgfQogICAgfTsKICAgIFRhYmxlKGludCB3aWR0aCwgaW50IGhlaWdodCwgVCBmaWxsKQogICAgewogICAgICAgIHRoaXMtPndpZHRoID0gd2lkdGg7CiAgICAgICAgdGhpcy0+aGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIHRoaXMtPnAyID0gMzIgLSBfX2J1aWx0aW5fY2x6KHdpZHRoIC0gMSk7CiAgICAgICAgaW50IGxlbiA9IGhlaWdodCAqIHNpemVvZihUKSA8PCBwMjsKICAgICAgICB0aGlzLT5kYXRhID0gbmV3IFRbbGVuXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSBkYXRhW2ldID0gZmlsbDsKICAgIH0KICAgIENvbHVtbiBvcGVyYXRvcltdKGludCB4KQogICAgewogICAgICAgIHJldHVybiBDb2x1bW4oZGF0YSwgeCwgcDIpOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBUYWJsZTxpbnQ+IFRhYmxlKDEwMCwgMjAwLCA3Myk7CiAgICBUYWJsZVsxMF1bMjBdID0gMTAwOwogICAgc3RkOjpjb3V0IDw8IFRhYmxlWzldWzE5XSA8PCAiICIgPDwgVGFibGVbMTBdWzIwXSA8PCAiICIgPDwgVGFibGVbMTFdWzIxXSA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQo=