#include <algorithm>
#include <iostream>
#include <vector>
struct Position {int x; int y;};
bool operator == (const Position& lhs, const Position& rhs)
{
return lhs.x == rhs.x && lhs.y == rhs.y;
}
bool operator < (const Position& lhs, const Position& rhs)
{
if (lhs.x != rhs.x) {
return lhs.x < rhs.x;
}
return lhs.y < rhs.y;
}
std::ostream& operator << (std::ostream& stream, const Position& p)
{
return stream << "(" << p.x << ", " << p.y << ")";
}
void print(const std::vector<Position>& v)
{
const char* sep = "";
std::cout << "{";
for (const auto& p : v) {
std::cout << sep << p;
sep = ", ";
}
std::cout << "}" << std::endl;
}
void filter(std::vector<Position>& positions, const std::vector<Position>& destroyedFields)
{
for (auto it = positions.begin(); it != positions.end(); ) {
if (std::find(destroyedFields.begin(), destroyedFields.end(), *it) != destroyedFields.end()) {
it = positions.erase(it);
} else {
++it;
}
}
}
std::vector<Position> filter2(const std::vector<Position>& positions, const std::vector<Position>& destroyedFields)
{
std::vector<Position> res;
std::set_difference(positions.begin(), positions.end(),
destroyedFields.begin(), destroyedFields.end(),
std::back_inserter(res));
return res;
}
int main()
{
const std::vector<Position> original_positions = {{0, 0}, {1, 3}, {2, 4}, {5, 5}, {42, 0}};
const std::vector<Position> original_destroyedFields = {{2, 4}, {42, 0}};
std::vector<Position> positions(original_positions);
std::vector<Position> destroyedFields(original_destroyedFields);
std::sort(positions.begin(), positions.end());
std::sort(destroyedFields.begin(), destroyedFields.end());
print(filter2(positions, destroyedFields));
filter(positions, destroyedFields);
print(positions);
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IFBvc2l0aW9uIHtpbnQgeDsgaW50IHk7fTsKCmJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFBvc2l0aW9uJiBsaHMsIGNvbnN0IFBvc2l0aW9uJiByaHMpCnsKICAgIHJldHVybiBsaHMueCA9PSByaHMueCAmJiBsaHMueSA9PSByaHMueTsKfQoKYm9vbCBvcGVyYXRvciA8IChjb25zdCBQb3NpdGlvbiYgbGhzLCBjb25zdCBQb3NpdGlvbiYgcmhzKQp7CiAgICBpZiAobGhzLnggIT0gcmhzLngpIHsKICAgICAgICByZXR1cm4gbGhzLnggPCByaHMueDsKICAgIH0KICAgIHJldHVybiBsaHMueSA8IHJocy55Owp9CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mIHN0cmVhbSwgY29uc3QgUG9zaXRpb24mIHApCnsKICAgIHJldHVybiBzdHJlYW0gPDwgIigiIDw8IHAueCA8PCAiLCAiIDw8IHAueSA8PCAiKSI7Cn0KCnZvaWQgcHJpbnQoY29uc3Qgc3RkOjp2ZWN0b3I8UG9zaXRpb24+JiB2KQp7CiAgICBjb25zdCBjaGFyKiBzZXAgPSAiIjsKICAgIHN0ZDo6Y291dCA8PCAieyI7CiAgICBmb3IgKGNvbnN0IGF1dG8mIHAgOiB2KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHNlcCA8PCBwOwogICAgICAgIHNlcCA9ICIsICI7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKfQoKdm9pZCBmaWx0ZXIoc3RkOjp2ZWN0b3I8UG9zaXRpb24+JiBwb3NpdGlvbnMsIGNvbnN0IHN0ZDo6dmVjdG9yPFBvc2l0aW9uPiYgZGVzdHJveWVkRmllbGRzKQp7CiAgICBmb3IgKGF1dG8gaXQgPSBwb3NpdGlvbnMuYmVnaW4oKTsgaXQgIT0gcG9zaXRpb25zLmVuZCgpOyApIHsKICAgICAgICBpZiAoc3RkOjpmaW5kKGRlc3Ryb3llZEZpZWxkcy5iZWdpbigpLCBkZXN0cm95ZWRGaWVsZHMuZW5kKCksICppdCkgIT0gZGVzdHJveWVkRmllbGRzLmVuZCgpKSB7CiAgICAgICAgICAgIGl0ID0gcG9zaXRpb25zLmVyYXNlKGl0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICArK2l0OwogICAgICAgIH0KICAgIH0KfQoKc3RkOjp2ZWN0b3I8UG9zaXRpb24+IGZpbHRlcjIoY29uc3Qgc3RkOjp2ZWN0b3I8UG9zaXRpb24+JiBwb3NpdGlvbnMsIGNvbnN0IHN0ZDo6dmVjdG9yPFBvc2l0aW9uPiYgZGVzdHJveWVkRmllbGRzKQp7CiAgICBzdGQ6OnZlY3RvcjxQb3NpdGlvbj4gcmVzOwogICAgc3RkOjpzZXRfZGlmZmVyZW5jZShwb3NpdGlvbnMuYmVnaW4oKSwgcG9zaXRpb25zLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95ZWRGaWVsZHMuYmVnaW4oKSwgZGVzdHJveWVkRmllbGRzLmVuZCgpLAogICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIocmVzKSk7CiAgICByZXR1cm4gcmVzOwp9CgppbnQgbWFpbigpCnsKICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBvc2l0aW9uPiBvcmlnaW5hbF9wb3NpdGlvbnMgPSB7ezAsIDB9LCB7MSwgM30sIHsyLCA0fSwgezUsIDV9LCB7NDIsIDB9fTsKICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBvc2l0aW9uPiBvcmlnaW5hbF9kZXN0cm95ZWRGaWVsZHMgPSB7ezIsIDR9LCB7NDIsIDB9fTsKCiAgICBzdGQ6OnZlY3RvcjxQb3NpdGlvbj4gcG9zaXRpb25zKG9yaWdpbmFsX3Bvc2l0aW9ucyk7CiAgICBzdGQ6OnZlY3RvcjxQb3NpdGlvbj4gZGVzdHJveWVkRmllbGRzKG9yaWdpbmFsX2Rlc3Ryb3llZEZpZWxkcyk7CgogICAgc3RkOjpzb3J0KHBvc2l0aW9ucy5iZWdpbigpLCBwb3NpdGlvbnMuZW5kKCkpOwogICAgc3RkOjpzb3J0KGRlc3Ryb3llZEZpZWxkcy5iZWdpbigpLCBkZXN0cm95ZWRGaWVsZHMuZW5kKCkpOwoKICAgIHByaW50KGZpbHRlcjIocG9zaXRpb25zLCBkZXN0cm95ZWRGaWVsZHMpKTsKICAgIGZpbHRlcihwb3NpdGlvbnMsIGRlc3Ryb3llZEZpZWxkcyk7CiAgICBwcmludChwb3NpdGlvbnMpOwoKICAgIHJldHVybiAwOwp9Cg==