#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
#include <iostream>
using namespace std;
struct Data {
Data(size_t l, size_t h) : iLo(l), iHi(h) {}
size_t iLo;
size_t iHi;
};
template <class Impl>
struct MyIter : public iterator<random_access_iterator_tag, size_t>
{
typedef vector<Data>::iterator Base;
Base base;
MyIter(Base i) : base(i) {}
bool operator !=(const Impl &rhs) const {
return base != rhs.base;
}
bool operator ==(const Impl &rhs) const {
return base == rhs.base;
}
bool operator <(const Impl &rhs) const {
return base < rhs.base;
}
ptrdiff_t operator -(const Impl &rhs) const {
return base - rhs.base;
}
Impl operator +(ptrdiff_t i) const {
return base + i;
}
Impl operator -(ptrdiff_t i) const {
return base - i;
}
Impl &operator ++() {
++base;
return static_cast<Impl&>(*this);
}
Impl &operator --() {
--base;
return static_cast<Impl&>(*this);
}
};
struct MyLoIter : public MyIter<MyLoIter>
{
MyLoIter(Base i) : MyIter(i) {}
size_t &operator [](int i) {
return base[i].iLo;
}
size_t &operator *() {
return base->iLo;
}
};
struct MyHiIter : public MyIter<MyHiIter>
{
MyHiIter(Base i) : MyIter(i) {}
size_t &operator [](int i) {
return base[i].iHi;
}
size_t &operator *() {
return base->iHi;
}
};
int main() {
vector<Data> data;
data.push_back(Data(1, 3));
data.push_back(Data(4, 66));
data.push_back(Data(0, 0));
data.push_back(Data(0, 1));
sort(MyLoIter(data.begin()), MyLoIter(data.end()), less<size_t>());
sort(MyHiIter(data.begin()), MyHiIter(data.end()), greater<size_t>());
for (vector<Data>::iterator i = data.begin(); i != data.end(); ++i) {
cout << i->iLo << "\t" << i->iHi << endl;
}
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBEYXRhIHsKICAgIERhdGEoc2l6ZV90IGwsIHNpemVfdCBoKSA6IGlMbyhsKSwgaUhpKGgpIHt9CgogICAgc2l6ZV90IGlMbzsKICAgIHNpemVfdCBpSGk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgSW1wbD4Kc3RydWN0IE15SXRlciA6IHB1YmxpYyBpdGVyYXRvcjxyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgc2l6ZV90Pgp7CiAgICB0eXBlZGVmIHZlY3RvcjxEYXRhPjo6aXRlcmF0b3IgQmFzZTsKICAgIEJhc2UgYmFzZTsKCiAgICBNeUl0ZXIoQmFzZSBpKSA6IGJhc2UoaSkge30KCiAgICBib29sIG9wZXJhdG9yICE9KGNvbnN0IEltcGwgJnJocykgY29uc3QgewogICAgICAgIHJldHVybiBiYXNlICE9IHJocy5iYXNlOwogICAgfQogICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBJbXBsICZyaHMpIGNvbnN0IHsKICAgICAgICByZXR1cm4gYmFzZSA9PSByaHMuYmFzZTsKICAgIH0KICAgIGJvb2wgb3BlcmF0b3IgPChjb25zdCBJbXBsICZyaHMpIGNvbnN0IHsKICAgICAgICByZXR1cm4gYmFzZSA8IHJocy5iYXNlOwogICAgfQoKICAgIHB0cmRpZmZfdCBvcGVyYXRvciAtKGNvbnN0IEltcGwgJnJocykgY29uc3QgewogICAgICAgIHJldHVybiBiYXNlIC0gcmhzLmJhc2U7CiAgICB9CgogICAgSW1wbCBvcGVyYXRvciArKHB0cmRpZmZfdCBpKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIGJhc2UgKyBpOwogICAgfQogICAgSW1wbCBvcGVyYXRvciAtKHB0cmRpZmZfdCBpKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIGJhc2UgLSBpOwogICAgfQogICAgSW1wbCAmb3BlcmF0b3IgKysoKSB7CiAgICAgICAgKytiYXNlOwogICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxJbXBsJj4oKnRoaXMpOwogICAgfQogICAgSW1wbCAmb3BlcmF0b3IgLS0oKSB7CiAgICAgICAgLS1iYXNlOwogICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxJbXBsJj4oKnRoaXMpOwogICAgfQp9OwoKc3RydWN0IE15TG9JdGVyIDogcHVibGljIE15SXRlcjxNeUxvSXRlcj4KewogICAgTXlMb0l0ZXIoQmFzZSBpKSA6IE15SXRlcihpKSB7fQoKICAgIHNpemVfdCAmb3BlcmF0b3IgW10oaW50IGkpIHsKICAgICAgICByZXR1cm4gYmFzZVtpXS5pTG87CiAgICB9CiAgICBzaXplX3QgJm9wZXJhdG9yICooKSB7CiAgICAgICAgcmV0dXJuIGJhc2UtPmlMbzsKICAgIH0KfTsKCnN0cnVjdCBNeUhpSXRlciA6IHB1YmxpYyBNeUl0ZXI8TXlIaUl0ZXI+CnsKICAgIE15SGlJdGVyKEJhc2UgaSkgOiBNeUl0ZXIoaSkge30KCiAgICBzaXplX3QgJm9wZXJhdG9yIFtdKGludCBpKSB7CiAgICAgICAgcmV0dXJuIGJhc2VbaV0uaUhpOwogICAgfQogICAgc2l6ZV90ICZvcGVyYXRvciAqKCkgewogICAgICAgIHJldHVybiBiYXNlLT5pSGk7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIHZlY3RvcjxEYXRhPiBkYXRhOwogICAgZGF0YS5wdXNoX2JhY2soRGF0YSgxLCAzKSk7CiAgICBkYXRhLnB1c2hfYmFjayhEYXRhKDQsIDY2KSk7CiAgICBkYXRhLnB1c2hfYmFjayhEYXRhKDAsIDApKTsKICAgIGRhdGEucHVzaF9iYWNrKERhdGEoMCwgMSkpOwoKICAgIHNvcnQoTXlMb0l0ZXIoZGF0YS5iZWdpbigpKSwgTXlMb0l0ZXIoZGF0YS5lbmQoKSksIGxlc3M8c2l6ZV90PigpKTsKICAgIHNvcnQoTXlIaUl0ZXIoZGF0YS5iZWdpbigpKSwgTXlIaUl0ZXIoZGF0YS5lbmQoKSksIGdyZWF0ZXI8c2l6ZV90PigpKTsKCiAgICBmb3IgKHZlY3RvcjxEYXRhPjo6aXRlcmF0b3IgaSA9IGRhdGEuYmVnaW4oKTsgaSAhPSBkYXRhLmVuZCgpOyArK2kpIHsKICAgICAgICBjb3V0IDw8IGktPmlMbyA8PCAiXHQiIDw8IGktPmlIaSA8PCBlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==