#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;
}
