#include <iterator>
#include <memory>
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long
>
class indexer : public std::iterator<std::random_access_iterator_tag, T, Difference>
{
using Indexer = indexer<C, T, Index, Difference>;
public:
indexer(C<T>& c, Index i, Index end)
: c_(std::addressof(c)), i_(i), end_(end) {}
T& operator*() const {
return (*c_)[i_];
};
T& operator[](Index i) const {
return (*c_)[i_ + i];
}
Indexer& operator++() {
++i_;
return *this;
};
Indexer operator++(int) {
auto&& old = *this;
operator++();
return old;
}
Indexer& operator--() {
--i_;
return *this;
}
Indexer operator--(int) {
auto&& old = *this;
operator--();
return old;
}
Indexer& operator+=(Index delta) {
i_ += delta;
return *this;
}
Indexer operator-=(Index delta) {
i_ -= delta;
return *this;
}
Difference operator-(Indexer const& other) const {
return (Difference)i_ - other.i_;
}
bool operator==(Indexer const& other) const {
return i_ == other.i_;
}
bool operator<(Indexer const& other) const {
return i_ < other.i_;
}
private:
C<T>* c_;
Index i_, end_;
};
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long,
typename Delta,
typename Indexer = indexer<C, T, Index, Difference>
>
Indexer operator+(indexer<C, T, Index, Difference> lhs, Delta rhs) {
return lhs += rhs;
}
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long,
typename Delta,
typename Indexer = indexer<C, T, Index, Difference>
>
Indexer operator+(Delta lhs, indexer<C, T, Index, Difference> rhs) {
return rhs += lhs;
}
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long,
typename Delta,
typename Indexer = indexer<C, T, Index, Difference>
>
Indexer operator-(indexer<C, T, Index, Difference> lhs, Delta rhs) {
return lhs -= rhs;
}
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long,
typename Delta,
typename Indexer = indexer<C, T, Index, Difference>
>
Indexer operator-(Delta lhs, indexer<C, T, Index, Difference> rhs) {
return rhs -= lhs;
}
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long
>
bool operator!=(indexer<C, T, Index, Difference> const& lhs, indexer<C, T, Index, Difference> const& rhs) {
return !(lhs == rhs);
}
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long
>
bool operator>(indexer<C, T, Index, Difference> const& lhs, indexer<C, T, Index, Difference> const& rhs) {
return rhs < lhs;
}
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long
>
bool operator<=(indexer<C, T, Index, Difference> const& lhs, indexer<C, T, Index, Difference> const& rhs) {
return !(lhs > rhs);
}
template<template<typename> class C,
typename T,
typename Index = std::size_t,
typename Difference = long
>
bool operator>=(indexer<C, T, Index, Difference> const& lhs, indexer<C, T, Index, Difference> const& rhs) {
return !(lhs < rhs);
}
#include <algorithm>
#include <iostream>
#include <vector>
template<typename T>
class vector_view
{
public:
vector_view(std::vector<T>& v, std::size_t start, std::size_t n)
: v_(v), start_(start), n_(n) {}
std::size_t size() { return n_; }
T& operator[](int i) { return v_[start_ + i]; }
private:
std::vector<T>& v_;
std::size_t start_, n_;
};
template<typename T>
indexer<vector_view, T> begin(vector_view<T>& vv) {
return indexer<vector_view, T>(vv, 0, vv.size());
}
template<typename T>
indexer<vector_view, T> end(vector_view<T>& vv) {
auto&& size = vv.size();
return indexer<vector_view, T>(vv, size, size);
}
int main() {
std::vector<int> v = {0, 6, 1, 5, 3, 8};
/* double the three elements starting from the 2nd element (i.e. v[2], v[3], v[4]) */
for (auto& x : vector_view<int>(v, 2, 3))
x *= 2;
for (auto x : v)
std::cout << x << ' ';
std::cout << std::endl;
vector_view<int> vv(v, 3, 3);
/* sort the three elements starting from the 3rd element */
std::sort(begin(vv), end(vv));
for (auto x : v)
std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIEMsCiAgICAgICAgIHR5cGVuYW1lIFQsCiAgICAgICAgIHR5cGVuYW1lIEluZGV4ID0gc3RkOjpzaXplX3QsCiAgICAgICAgIHR5cGVuYW1lIERpZmZlcmVuY2UgPSBsb25nCiAgICAgICAgID4KY2xhc3MgaW5kZXhlciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIFQsIERpZmZlcmVuY2U+CnsKICAgIHVzaW5nIEluZGV4ZXIgPSBpbmRleGVyPEMsIFQsIEluZGV4LCBEaWZmZXJlbmNlPjsKcHVibGljOgogICAgaW5kZXhlcihDPFQ+JiBjLCBJbmRleCBpLCBJbmRleCBlbmQpCiAgICAgICAgOiBjXyhzdGQ6OmFkZHJlc3NvZihjKSksIGlfKGkpLCBlbmRfKGVuZCkge30KCiAgICBUJiBvcGVyYXRvciooKSBjb25zdCB7CiAgICAgICAgcmV0dXJuICgqY18pW2lfXTsKICAgIH07CiAgICAKICAgIFQmIG9wZXJhdG9yW10oSW5kZXggaSkgY29uc3QgewogICAgICAgIHJldHVybiAoKmNfKVtpXyArIGldOwogICAgfQoKICAgIEluZGV4ZXImIG9wZXJhdG9yKysoKSB7CiAgICAgICAgKytpXzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9OwogICAgCiAgICBJbmRleGVyIG9wZXJhdG9yKysoaW50KSB7CiAgICAgICAgYXV0byYmIG9sZCA9ICp0aGlzOwogICAgICAgIG9wZXJhdG9yKysoKTsKICAgICAgICByZXR1cm4gb2xkOwogICAgfQogICAgCiAgICBJbmRleGVyJiBvcGVyYXRvci0tKCkgewogICAgICAgIC0taV87CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgCiAgICBJbmRleGVyIG9wZXJhdG9yLS0oaW50KSB7CiAgICAgICAgYXV0byYmIG9sZCA9ICp0aGlzOwogICAgICAgIG9wZXJhdG9yLS0oKTsKICAgICAgICByZXR1cm4gb2xkOwogICAgfQogICAgCiAgICBJbmRleGVyJiBvcGVyYXRvcis9KEluZGV4IGRlbHRhKSB7CiAgICAgICAgaV8gKz0gZGVsdGE7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgCiAgICBJbmRleGVyIG9wZXJhdG9yLT0oSW5kZXggZGVsdGEpIHsKICAgICAgICBpXyAtPSBkZWx0YTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICAKICAgIERpZmZlcmVuY2Ugb3BlcmF0b3ItKEluZGV4ZXIgY29uc3QmIG90aGVyKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIChEaWZmZXJlbmNlKWlfIC0gb3RoZXIuaV87CiAgICB9CgogICAgYm9vbCBvcGVyYXRvcj09KEluZGV4ZXIgY29uc3QmIG90aGVyKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIGlfID09IG90aGVyLmlfOwogICAgfQogICAgCiAgICBib29sIG9wZXJhdG9yPChJbmRleGVyIGNvbnN0JiBvdGhlcikgY29uc3QgewogICAgICAgIHJldHVybiBpXyA8IG90aGVyLmlfOwogICAgfQoKcHJpdmF0ZToKICAgIEM8VD4qIGNfOwogICAgSW5kZXggaV8sIGVuZF87Cn07Cgp0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgQywKICAgICAgICAgdHlwZW5hbWUgVCwKICAgICAgICAgdHlwZW5hbWUgSW5kZXggPSBzdGQ6OnNpemVfdCwKICAgICAgICAgdHlwZW5hbWUgRGlmZmVyZW5jZSA9IGxvbmcsCiAgICAgICAgIHR5cGVuYW1lIERlbHRhLAogICAgICAgICB0eXBlbmFtZSBJbmRleGVyID0gaW5kZXhlcjxDLCBULCBJbmRleCwgRGlmZmVyZW5jZT4KICAgICAgICAgPgpJbmRleGVyIG9wZXJhdG9yKyhpbmRleGVyPEMsIFQsIEluZGV4LCBEaWZmZXJlbmNlPiBsaHMsIERlbHRhIHJocykgewogICAgcmV0dXJuIGxocyArPSByaHM7Cn0KCnRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBDLAogICAgICAgICB0eXBlbmFtZSBULAogICAgICAgICB0eXBlbmFtZSBJbmRleCA9IHN0ZDo6c2l6ZV90LAogICAgICAgICB0eXBlbmFtZSBEaWZmZXJlbmNlID0gbG9uZywKICAgICAgICAgdHlwZW5hbWUgRGVsdGEsCiAgICAgICAgIHR5cGVuYW1lIEluZGV4ZXIgPSBpbmRleGVyPEMsIFQsIEluZGV4LCBEaWZmZXJlbmNlPgogICAgICAgICA+CkluZGV4ZXIgb3BlcmF0b3IrKERlbHRhIGxocywgaW5kZXhlcjxDLCBULCBJbmRleCwgRGlmZmVyZW5jZT4gcmhzKSB7CiAgICByZXR1cm4gcmhzICs9IGxoczsKfQoKdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIEMsCiAgICAgICAgIHR5cGVuYW1lIFQsCiAgICAgICAgIHR5cGVuYW1lIEluZGV4ID0gc3RkOjpzaXplX3QsCiAgICAgICAgIHR5cGVuYW1lIERpZmZlcmVuY2UgPSBsb25nLAogICAgICAgICB0eXBlbmFtZSBEZWx0YSwKICAgICAgICAgdHlwZW5hbWUgSW5kZXhlciA9IGluZGV4ZXI8QywgVCwgSW5kZXgsIERpZmZlcmVuY2U+CiAgICAgICAgID4KSW5kZXhlciBvcGVyYXRvci0oaW5kZXhlcjxDLCBULCBJbmRleCwgRGlmZmVyZW5jZT4gbGhzLCBEZWx0YSByaHMpIHsKICAgIHJldHVybiBsaHMgLT0gcmhzOwp9Cgp0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgQywKICAgICAgICAgdHlwZW5hbWUgVCwKICAgICAgICAgdHlwZW5hbWUgSW5kZXggPSBzdGQ6OnNpemVfdCwKICAgICAgICAgdHlwZW5hbWUgRGlmZmVyZW5jZSA9IGxvbmcsCiAgICAgICAgIHR5cGVuYW1lIERlbHRhLAogICAgICAgICB0eXBlbmFtZSBJbmRleGVyID0gaW5kZXhlcjxDLCBULCBJbmRleCwgRGlmZmVyZW5jZT4KICAgICAgICAgPgpJbmRleGVyIG9wZXJhdG9yLShEZWx0YSBsaHMsIGluZGV4ZXI8QywgVCwgSW5kZXgsIERpZmZlcmVuY2U+IHJocykgewogICAgcmV0dXJuIHJocyAtPSBsaHM7Cn0KCnRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBDLAogICAgICAgICB0eXBlbmFtZSBULAogICAgICAgICB0eXBlbmFtZSBJbmRleCA9IHN0ZDo6c2l6ZV90LAogICAgICAgICB0eXBlbmFtZSBEaWZmZXJlbmNlID0gbG9uZwogICAgICAgICA+CmJvb2wgb3BlcmF0b3IhPShpbmRleGVyPEMsIFQsIEluZGV4LCBEaWZmZXJlbmNlPiBjb25zdCYgbGhzLCBpbmRleGVyPEMsIFQsIEluZGV4LCBEaWZmZXJlbmNlPiBjb25zdCYgcmhzKSB7CiAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKfQoKdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIEMsCiAgICAgICAgIHR5cGVuYW1lIFQsCiAgICAgICAgIHR5cGVuYW1lIEluZGV4ID0gc3RkOjpzaXplX3QsCiAgICAgICAgIHR5cGVuYW1lIERpZmZlcmVuY2UgPSBsb25nCiAgICAgICAgID4KYm9vbCBvcGVyYXRvcj4oaW5kZXhlcjxDLCBULCBJbmRleCwgRGlmZmVyZW5jZT4gY29uc3QmIGxocywgaW5kZXhlcjxDLCBULCBJbmRleCwgRGlmZmVyZW5jZT4gY29uc3QmIHJocykgewogICAgcmV0dXJuIHJocyA8IGxoczsKfQoKdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIEMsCiAgICAgICAgIHR5cGVuYW1lIFQsCiAgICAgICAgIHR5cGVuYW1lIEluZGV4ID0gc3RkOjpzaXplX3QsCiAgICAgICAgIHR5cGVuYW1lIERpZmZlcmVuY2UgPSBsb25nCiAgICAgICAgID4KYm9vbCBvcGVyYXRvcjw9KGluZGV4ZXI8QywgVCwgSW5kZXgsIERpZmZlcmVuY2U+IGNvbnN0JiBsaHMsIGluZGV4ZXI8QywgVCwgSW5kZXgsIERpZmZlcmVuY2U+IGNvbnN0JiByaHMpIHsKICAgIHJldHVybiAhKGxocyA+IHJocyk7Cn0KCnRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBDLAogICAgICAgICB0eXBlbmFtZSBULAogICAgICAgICB0eXBlbmFtZSBJbmRleCA9IHN0ZDo6c2l6ZV90LAogICAgICAgICB0eXBlbmFtZSBEaWZmZXJlbmNlID0gbG9uZwogICAgICAgICA+CmJvb2wgb3BlcmF0b3I+PShpbmRleGVyPEMsIFQsIEluZGV4LCBEaWZmZXJlbmNlPiBjb25zdCYgbGhzLCBpbmRleGVyPEMsIFQsIEluZGV4LCBEaWZmZXJlbmNlPiBjb25zdCYgcmhzKSB7CiAgICByZXR1cm4gIShsaHMgPCByaHMpOwp9CgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyB2ZWN0b3Jfdmlldwp7CnB1YmxpYzoKICAgIHZlY3Rvcl92aWV3KHN0ZDo6dmVjdG9yPFQ+JiB2LCBzdGQ6OnNpemVfdCBzdGFydCwgc3RkOjpzaXplX3QgbikKICAgICAgICA6IHZfKHYpLCBzdGFydF8oc3RhcnQpLCBuXyhuKSB7fQoKICAgIHN0ZDo6c2l6ZV90IHNpemUoKSB7IHJldHVybiBuXzsgfQogICAgVCYgb3BlcmF0b3JbXShpbnQgaSkgeyByZXR1cm4gdl9bc3RhcnRfICsgaV07IH0KCnByaXZhdGU6CiAgICBzdGQ6OnZlY3RvcjxUPiYgdl87CiAgICBzdGQ6OnNpemVfdCBzdGFydF8sIG5fOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KaW5kZXhlcjx2ZWN0b3JfdmlldywgVD4gYmVnaW4odmVjdG9yX3ZpZXc8VD4mIHZ2KSB7CiAgICByZXR1cm4gaW5kZXhlcjx2ZWN0b3JfdmlldywgVD4odnYsIDAsIHZ2LnNpemUoKSk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmluZGV4ZXI8dmVjdG9yX3ZpZXcsIFQ+IGVuZCh2ZWN0b3JfdmlldzxUPiYgdnYpIHsKICAgIGF1dG8mJiBzaXplID0gdnYuc2l6ZSgpOwogICAgcmV0dXJuIGluZGV4ZXI8dmVjdG9yX3ZpZXcsIFQ+KHZ2LCBzaXplLCBzaXplKTsKfQoKaW50IG1haW4oKSB7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHYgPSB7MCwgNiwgMSwgNSwgMywgOH07CiAgICAKICAgIC8qIGRvdWJsZSB0aGUgdGhyZWUgZWxlbWVudHMgc3RhcnRpbmcgZnJvbSB0aGUgMm5kIGVsZW1lbnQgKGkuZS4gdlsyXSwgdlszXSwgdls0XSkgKi8KICAgIGZvciAoYXV0byYgeCA6IHZlY3Rvcl92aWV3PGludD4odiwgMiwgMykpCiAgICAgICAgeCAqPSAyOwoKICAgIGZvciAoYXV0byB4IDogdikKICAgICAgICBzdGQ6OmNvdXQgPDwgeCA8PCAnICc7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgCiAgICB2ZWN0b3JfdmlldzxpbnQ+IHZ2KHYsIDMsIDMpOwogICAgLyogc29ydCB0aGUgdGhyZWUgZWxlbWVudHMgc3RhcnRpbmcgZnJvbSB0aGUgM3JkIGVsZW1lbnQgKi8KICAgIHN0ZDo6c29ydChiZWdpbih2diksIGVuZCh2dikpOwogICAgCiAgICBmb3IgKGF1dG8geCA6IHYpCiAgICAgICAgc3RkOjpjb3V0IDw8IHggPDwgJyAnOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgcmV0dXJuIDA7Cn0K