#include <iostream>
#include <vector>
#include <array>
#include <iterator>
using namespace std;
template<class T>
struct slice {
T* data;
std::size_t const* stride;
slice operator[](std::size_t I)const {
return{ data + I* *stride, stride + 1 };
}
operator T&()const { return *data; }
T& operator=(T in) { *data = std::move(in); return *data; }
};
template<class T>
struct buffer {
std::vector<T> data_;
std::vector<std::size_t> strides_;
buffer(std::vector<std::size_t> sizes) :strides_(sizes) {
std::size_t scale = 1;
for (std::size_t i = 0; i < sizes.size(); ++i) {
auto next = strides_[sizes.size() - 1 - i] * scale;
strides_[sizes.size() - 1 - i] = scale;
scale = next;
}
data_.resize(scale);
}
const std::vector<std::size_t>& strides() const { return strides_; };
T* data() { return data_.data(); }
slice<T> get() { return{ data_.data(), strides_.data() }; }
slice<T> operator[](std::size_t I) { return get()[I]; }
};
int main() {
// your code goes here
buffer<int> b({ 2,5,3 });
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 5; j++)
{
for (int k = 0; k < 3; k++)
{
b[i][j][k] = 3 * (5 * (i)+j) + k + 1;
}
}
}
copy(b.data(), b.data() + 2 * 5 * 3, ostream_iterator<int>(cout, " "));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxpdGVyYXRvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBzbGljZSB7CiAgICBUKiBkYXRhOwogICAgc3RkOjpzaXplX3QgY29uc3QqIHN0cmlkZTsKICAgIHNsaWNlIG9wZXJhdG9yW10oc3RkOjpzaXplX3QgSSljb25zdCB7CiAgICAgICAgcmV0dXJueyBkYXRhICsgSSogKnN0cmlkZSwgc3RyaWRlICsgMSB9OwogICAgfQogICAgb3BlcmF0b3IgVCYoKWNvbnN0IHsgcmV0dXJuICpkYXRhOyB9CiAgICBUJiBvcGVyYXRvcj0oVCBpbikgeyAqZGF0YSA9IHN0ZDo6bW92ZShpbik7IHJldHVybiAqZGF0YTsgfQp9OwoKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBidWZmZXIgewogICAgc3RkOjp2ZWN0b3I8VD4gZGF0YV87CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gc3RyaWRlc187CgogICAgYnVmZmVyKHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBzaXplcykgOnN0cmlkZXNfKHNpemVzKSB7CiAgICAgICAgc3RkOjpzaXplX3Qgc2NhbGUgPSAxOwogICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzaXplcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICBhdXRvIG5leHQgPSBzdHJpZGVzX1tzaXplcy5zaXplKCkgLSAxIC0gaV0gKiBzY2FsZTsKICAgICAgICAgICAgc3RyaWRlc19bc2l6ZXMuc2l6ZSgpIC0gMSAtIGldID0gc2NhbGU7CiAgICAgICAgICAgIHNjYWxlID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgZGF0YV8ucmVzaXplKHNjYWxlKTsKICAgIH0KICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiYgc3RyaWRlcygpIGNvbnN0IHsgcmV0dXJuIHN0cmlkZXNfOyB9OwogICAgVCogZGF0YSgpIHsgcmV0dXJuIGRhdGFfLmRhdGEoKTsgfQogICAgc2xpY2U8VD4gZ2V0KCkgeyByZXR1cm57IGRhdGFfLmRhdGEoKSwgc3RyaWRlc18uZGF0YSgpIH07IH0KICAgIHNsaWNlPFQ+IG9wZXJhdG9yW10oc3RkOjpzaXplX3QgSSkgeyByZXR1cm4gZ2V0KClbSV07IH0KCn07CgppbnQgbWFpbigpIHsKICAgIC8vIHlvdXIgY29kZSBnb2VzIGhlcmUKICAgIGJ1ZmZlcjxpbnQ+IGIoeyAyLDUsMyB9KTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykKICAgIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgaysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBiW2ldW2pdW2tdID0gMyAqICg1ICogKGkpK2opICsgayArIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjb3B5KGIuZGF0YSgpLCBiLmRhdGEoKSArIDIgKiA1ICogMywgb3N0cmVhbV9pdGVyYXRvcjxpbnQ+KGNvdXQsICIgIikpOwogICAgcmV0dXJuIDA7Cn0=