#include <iterator>
#include <vector>
template <class Iterator> class range;
template <class Iterator, class Category> class range_base;
template <class I>
class range_base<I, std::random_access_iterator_tag> {
protected:
range_base() : begin_(), end_() {}
template <class I1>
range_base(I1 begin, I1 end) : begin_(begin), end_(end) {}
I begin_;
I end_;
};
template <class I>
class range : public range_base<I, typename std::iterator_traits<I>::iterator_category> {
using base_type = range_base<I, typename std::iterator_traits<I>::iterator_category>;
public:
range() {}
template <class Iterator>
range(Iterator first, Iterator last) : base_type(first, last) {}
};
template <class Iterator>
range<Iterator> make_range(Iterator first, Iterator last) {
return range<Iterator>(first, last);
}
int main() {
std::vector<int> v = {3, 2};
auto r = make_range(v.begin(), v.end());
return 0;
}
I2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiBjbGFzcyByYW5nZTsKCnRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvciwgY2xhc3MgQ2F0ZWdvcnk+IGNsYXNzIHJhbmdlX2Jhc2U7Cgp0ZW1wbGF0ZSA8Y2xhc3MgST4KY2xhc3MgcmFuZ2VfYmFzZTxJLCBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPiB7CnByb3RlY3RlZDoKICAgIHJhbmdlX2Jhc2UoKSA6IGJlZ2luXygpLCBlbmRfKCkge30KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgSTE+CiAgICByYW5nZV9iYXNlKEkxIGJlZ2luLCBJMSBlbmQpIDogYmVnaW5fKGJlZ2luKSwgZW5kXyhlbmQpIHt9CgogICAgSSBiZWdpbl87CiAgICBJIGVuZF87Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgST4KY2xhc3MgcmFuZ2UgOiBwdWJsaWMgcmFuZ2VfYmFzZTxJLCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJPjo6aXRlcmF0b3JfY2F0ZWdvcnk+IHsKICAgIHVzaW5nIGJhc2VfdHlwZSA9IHJhbmdlX2Jhc2U8SSwgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8ST46Oml0ZXJhdG9yX2NhdGVnb3J5PjsKcHVibGljOgogICAgcmFuZ2UoKSB7fQoKICAgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4KICAgIHJhbmdlKEl0ZXJhdG9yIGZpcnN0LCBJdGVyYXRvciBsYXN0KSA6IGJhc2VfdHlwZShmaXJzdCwgbGFzdCkge30KfTsKCnRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4KcmFuZ2U8SXRlcmF0b3I+IG1ha2VfcmFuZ2UoSXRlcmF0b3IgZmlyc3QsIEl0ZXJhdG9yIGxhc3QpIHsKICAgIHJldHVybiByYW5nZTxJdGVyYXRvcj4oZmlyc3QsIGxhc3QpOwp9CgppbnQgbWFpbigpIHsKICAgIHN0ZDo6dmVjdG9yPGludD4gdiA9IHszLCAyfTsKICAgIGF1dG8gciA9IG1ha2VfcmFuZ2Uodi5iZWdpbigpLCB2LmVuZCgpKTsKICAgIHJldHVybiAwOwp9Cg==