#include <iostream>
using namespace std;
class A {
public:
int x;
A(int x = 0) : x(x) {}
struct Cmp {
const A *ptr;
mutable bool val;
operator bool() const {
return val;
}
const Cmp &operator == (const A &other) const {
return other == *this;
}
};
bool isEqualTo (const A &other) const {
return x == other.x;
}
Cmp operator == (const A &other) const {
return {this, isEqualTo(other)};
}
const Cmp &operator == (const Cmp &other) const {
//other.val = other.val && (*this == *other.ptr).val;
other.val &= other.ptr->isEqualTo(*this);
return other;
}
};
int main() {
cout << (A(10) == A(10) == A(10)) << endl;
cout << (A(10) == A(9) == A(10)) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQSB7CnB1YmxpYzoKICAgIGludCB4OwoKICAgIEEoaW50IHggPSAwKSA6IHgoeCkge30KCiAgICBzdHJ1Y3QgQ21wIHsKICAgICAgICBjb25zdCBBICpwdHI7CiAgICAgICAgbXV0YWJsZSBib29sIHZhbDsKCiAgICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKICAgICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICB9CgogICAgICAgIGNvbnN0IENtcCAmb3BlcmF0b3IgPT0gKGNvbnN0IEEgJm90aGVyKSBjb25zdCB7CiAgICAgICAgICAgIHJldHVybiBvdGhlciA9PSAqdGhpczsKICAgICAgICB9CiAgICB9OwogICAgCiAgICBib29sIGlzRXF1YWxUbyAoY29uc3QgQSAmb3RoZXIpIGNvbnN0IHsKICAgIAlyZXR1cm4geCA9PSBvdGhlci54OwogICAgfQoKICAgIENtcCBvcGVyYXRvciA9PSAoY29uc3QgQSAmb3RoZXIpIGNvbnN0IHsgICAgICAgIAogICAgICAgIHJldHVybiB7dGhpcywgaXNFcXVhbFRvKG90aGVyKX07CiAgICB9CgogICAgY29uc3QgQ21wICZvcGVyYXRvciA9PSAoY29uc3QgQ21wICZvdGhlcikgY29uc3QgewogICAgICAgIC8vb3RoZXIudmFsID0gb3RoZXIudmFsICYmICgqdGhpcyA9PSAqb3RoZXIucHRyKS52YWw7CiAgICAgICAgb3RoZXIudmFsICY9IG90aGVyLnB0ci0+aXNFcXVhbFRvKCp0aGlzKTsKICAgICAgICByZXR1cm4gb3RoZXI7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIGNvdXQgPDwgKEEoMTApID09IEEoMTApID09IEEoMTApKSA8PCBlbmRsOwogICAgY291dCA8PCAoQSgxMCkgPT0gQSg5KSA9PSBBKDEwKSkgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==