#include <iostream>
using namespace std;
template<typename T>
struct relational
{
friend bool operator> (T const &lhs, T const &rhs) { return rhs < lhs; }
friend bool operator==(T const &lhs, T const &rhs) { return !(lhs < rhs || lhs > rhs); }
friend bool operator!=(T const &lhs, T const &rhs) { return !(rhs == lhs); }
friend bool operator<=(T const &lhs, T const &rhs) { return !(rhs < lhs); }
friend bool operator>=(T const &lhs, T const &rhs) { return !(lhs < rhs); }
};
struct foo : relational<foo>
{
int a;
foo(int a) : a(a) {}
friend bool operator<(foo const &f1, foo const &f2)
{
return f1.a < f2.a;
}
};
int main() {
foo f1(1), f2(2);
cout << (f1 == f2) << endl;
cout << (f2 > f1) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCByZWxhdGlvbmFsCiAgICB7CiAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+IChUIGNvbnN0ICZsaHMsIFQgY29uc3QgJnJocykgeyByZXR1cm4gcmhzIDwgbGhzOyB9CiAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShUIGNvbnN0ICZsaHMsIFQgY29uc3QgJnJocykgeyByZXR1cm4gIShsaHMgPCByaHMgfHwgbGhzID4gcmhzKTsgfQogICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oVCBjb25zdCAmbGhzLCBUIGNvbnN0ICZyaHMpIHsgcmV0dXJuICEocmhzID09IGxocyk7IH0KICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KFQgY29uc3QgJmxocywgVCBjb25zdCAmcmhzKSB7IHJldHVybiAhKHJocyA8IGxocyk7IH0KICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KFQgY29uc3QgJmxocywgVCBjb25zdCAmcmhzKSB7IHJldHVybiAhKGxocyA8IHJocyk7IH0KICAgIH07CiAgICAKICAgIHN0cnVjdCBmb28gOiByZWxhdGlvbmFsPGZvbz4KICAgIHsgCiAgICAJaW50IGE7CiAgICAJZm9vKGludCBhKSA6IGEoYSkge30KICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGZvbyBjb25zdCAmZjEsIGZvbyBjb25zdCAmZjIpCiAgICAgIHsKICAgICAgCXJldHVybiBmMS5hIDwgZjIuYTsKICAgICAgfQogICAgfTsKCmludCBtYWluKCkgewoJZm9vIGYxKDEpLCBmMigyKTsKCQoJY291dCA8PCAoZjEgPT0gZjIpIDw8IGVuZGw7Cgljb3V0IDw8IChmMiA+IGYxKSA8PCBlbmRsOwoJcmV0dXJuIDA7Cn0=