#include <iostream>
#include <map>
#include <utility>
class Cache
{
public:
struct Value
{
int value = 1;
int get() { return value; }
void set(int newvalue) { value = newvalue; }
};
Value& For(int a, int b) {
return values[std::make_pair(a, b)];
}
friend std::ostream& operator<<(std::ostream &os, const Cache &c)
{
for(auto &value : c.values)
std::cout << '[' << value.first.first << ',' << value.first.second << "] = " << value.second.value << std::endl;
return os;
}
private:
std::map<std::pair<int,int>, Value> values;
};
class Flight
{
public:
class Proxy
{
private:
Flight &f;
int a, b;
public:
Proxy(Flight &f, int a, int b) : f(f), a(a), b(b) {}
operator int() {
return f.cache.For(a, b).get();
};
Proxy& operator=(int value) {
f.cache.For(a, b).set(value);
return *this;
}
};
friend class Proxy;
Proxy operator()(int a, int b) {
return Proxy{*this, a, b};
}
friend std::ostream& operator<<(std::ostream &os, const Flight &f)
{
return os << f.cache;
}
private:
Cache cache;
};
int main()
{
Flight s;
int value = s(1, 2);
s(3, 4) = value;
std::cout << s;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dXRpbGl0eT4KCmNsYXNzIENhY2hlCnsKcHVibGljOgoJc3RydWN0IFZhbHVlCgl7CgkJaW50IHZhbHVlID0gMTsKCQlpbnQgZ2V0KCkgeyByZXR1cm4gdmFsdWU7IH0KCQl2b2lkIHNldChpbnQgbmV3dmFsdWUpIHsgdmFsdWUgPSBuZXd2YWx1ZTsgfQoJfTsKCglWYWx1ZSYgRm9yKGludCBhLCBpbnQgYikgewoJCXJldHVybiB2YWx1ZXNbc3RkOjptYWtlX3BhaXIoYSwgYildOwoJfQoKCWZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQ2FjaGUgJmMpCgl7CgkJZm9yKGF1dG8gJnZhbHVlIDogYy52YWx1ZXMpCgkJCXN0ZDo6Y291dCA8PCAnWycgPDwgdmFsdWUuZmlyc3QuZmlyc3QgPDwgJywnIDw8IHZhbHVlLmZpcnN0LnNlY29uZCA8PCAiXSA9ICIgPDwgdmFsdWUuc2Vjb25kLnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gb3M7Cgl9Cgpwcml2YXRlOgoJc3RkOjptYXA8c3RkOjpwYWlyPGludCxpbnQ+LCBWYWx1ZT4gdmFsdWVzOwp9OwoKY2xhc3MgRmxpZ2h0IAp7CnB1YmxpYzoKCWNsYXNzIFByb3h5Cgl7Cglwcml2YXRlOgoJCUZsaWdodCAmZjsKCQlpbnQgYSwgYjsKCglwdWJsaWM6CgkJUHJveHkoRmxpZ2h0ICZmLCBpbnQgYSwgaW50IGIpIDogZihmKSwgYShhKSwgYihiKSB7fQoKCQlvcGVyYXRvciBpbnQoKSB7CgkJCXJldHVybiBmLmNhY2hlLkZvcihhLCBiKS5nZXQoKTsKCQl9OwoKCQlQcm94eSYgb3BlcmF0b3I9KGludCB2YWx1ZSkgewoJCQlmLmNhY2hlLkZvcihhLCBiKS5zZXQodmFsdWUpOwoJCQlyZXR1cm4gKnRoaXM7CgkJfQoJfTsKCglmcmllbmQgY2xhc3MgUHJveHk7CgoJUHJveHkgb3BlcmF0b3IoKShpbnQgYSwgaW50IGIpIHsKCQlyZXR1cm4gUHJveHl7KnRoaXMsIGEsIGJ9OwoJfQoKCWZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgRmxpZ2h0ICZmKQoJewoJCXJldHVybiBvcyA8PCBmLmNhY2hlOwoJfQoKcHJpdmF0ZToKCUNhY2hlIGNhY2hlOwp9OwoKaW50IG1haW4oKQp7CglGbGlnaHQgczsKCWludCB2YWx1ZSA9IHMoMSwgMik7CglzKDMsIDQpID0gdmFsdWU7CglzdGQ6OmNvdXQgPDwgczsKCXJldHVybiAwOwp9