struct Bitmap {
   color getColor(point p);
   point next(point p);
}
struct Pixel { 
   color C; 
   point P 
};
std::map<Bitmap*, Pixel> GetUniquePixels(const std::vector<Bitmap>& bitmaps) {
    typedef unordered_map<color,Bitmap*> maybe_unique;
    typedef unordered_set<color> not_unique;
    std::map<point, std::pair<maybe_unique, not_unique>> uniqueness;
    for(int bit = 0; bit < bitmaps.size(); ++bit)
        for(point p = 0; p < bitmaps.size(); p = bitmap.next(point);
            color cur = bitmaps[bit].getColor(p);
            auto cur_unique = uniqueness[p];
            if (cur_unique.second.find(cur) != cur_unique.second.end()) 
                continue;
            auto it = cur_unique.first.find(cur);
            if (it != cur_unique.first.end()) {
                cur_unique.first.erase(cur);
                cur_unique.second.insert(cur);
            } else {
                cur_unique.first.insert(std::make_pair(cur, &bitmaps[bit]));
            }
        }
    }
    std::map<Bitmap, Pixel> result;
    for(auto u_it = uniqueness.begin(); u_it != uniqueness.end() ++u_it) {
        for(auto m_it = u_it->first.begin(); m_it != u_it->first.end(); ++m_it)
            result.insert(std::make_pair(m_it->second, Pixel(u_it->first, m_it->first));
    }
}
				c3RydWN0IEJpdG1hcCB7CiAgIGNvbG9yIGdldENvbG9yKHBvaW50IHApOwogICBwb2ludCBuZXh0KHBvaW50IHApOwp9CnN0cnVjdCBQaXhlbCB7IAogICBjb2xvciBDOyAKICAgcG9pbnQgUCAKfTsKc3RkOjptYXA8Qml0bWFwKiwgUGl4ZWw+IEdldFVuaXF1ZVBpeGVscyhjb25zdCBzdGQ6OnZlY3RvcjxCaXRtYXA+JiBiaXRtYXBzKSB7CiAgICB0eXBlZGVmIHVub3JkZXJlZF9tYXA8Y29sb3IsQml0bWFwKj4gbWF5YmVfdW5pcXVlOwogICAgdHlwZWRlZiB1bm9yZGVyZWRfc2V0PGNvbG9yPiBub3RfdW5pcXVlOwogICAgc3RkOjptYXA8cG9pbnQsIHN0ZDo6cGFpcjxtYXliZV91bmlxdWUsIG5vdF91bmlxdWU+PiB1bmlxdWVuZXNzOwogICAgZm9yKGludCBiaXQgPSAwOyBiaXQgPCBiaXRtYXBzLnNpemUoKTsgKytiaXQpCiAgICAgICAgZm9yKHBvaW50IHAgPSAwOyBwIDwgYml0bWFwcy5zaXplKCk7IHAgPSBiaXRtYXAubmV4dChwb2ludCk7CiAgICAgICAgICAgIGNvbG9yIGN1ciA9IGJpdG1hcHNbYml0XS5nZXRDb2xvcihwKTsKICAgICAgICAgICAgYXV0byBjdXJfdW5pcXVlID0gdW5pcXVlbmVzc1twXTsKICAgICAgICAgICAgaWYgKGN1cl91bmlxdWUuc2Vjb25kLmZpbmQoY3VyKSAhPSBjdXJfdW5pcXVlLnNlY29uZC5lbmQoKSkgCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgYXV0byBpdCA9IGN1cl91bmlxdWUuZmlyc3QuZmluZChjdXIpOwogICAgICAgICAgICBpZiAoaXQgIT0gY3VyX3VuaXF1ZS5maXJzdC5lbmQoKSkgewogICAgICAgICAgICAgICAgY3VyX3VuaXF1ZS5maXJzdC5lcmFzZShjdXIpOwogICAgICAgICAgICAgICAgY3VyX3VuaXF1ZS5zZWNvbmQuaW5zZXJ0KGN1cik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJfdW5pcXVlLmZpcnN0Lmluc2VydChzdGQ6Om1ha2VfcGFpcihjdXIsICZiaXRtYXBzW2JpdF0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHN0ZDo6bWFwPEJpdG1hcCwgUGl4ZWw+IHJlc3VsdDsKICAgIGZvcihhdXRvIHVfaXQgPSB1bmlxdWVuZXNzLmJlZ2luKCk7IHVfaXQgIT0gdW5pcXVlbmVzcy5lbmQoKSArK3VfaXQpIHsKICAgICAgICBmb3IoYXV0byBtX2l0ID0gdV9pdC0+Zmlyc3QuYmVnaW4oKTsgbV9pdCAhPSB1X2l0LT5maXJzdC5lbmQoKTsgKyttX2l0KQogICAgICAgICAgICByZXN1bHQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG1faXQtPnNlY29uZCwgUGl4ZWwodV9pdC0+Zmlyc3QsIG1faXQtPmZpcnN0KSk7CiAgICB9Cn0=