#include <vector>
class Set {
public:
Set() {}
explicit Set(const std::vector<int64_t>& vector) : myset(vector) {}
Set Union(const Set& b) const {
std::vector<int64_t> c = myset;
for (size_t i = 0; i < b.myset.size(); i++) {
if (std::find(c.begin(), c.end(), b.myset[i]) == c.end())
c.push_back(b.myset[i]);
}
return Set(c);
}
Set Intersection(const Set& b) const {
std::vector<int64_t> c;
for (size_t i = 0; i < myset.size(); i++) {
for (size_t j = 0; j < b.myset.size(); j++) {
if (myset[i] == b.myset[j]) {
c.push_back(b.myset[j]);
}
}
}
return Set(c);
}
Set Difference(const Set& b) const {
std::vector<int64_t> c = myset;
for (size_t i = 0; i < b.myset.size(); i++) {
auto it = std::find(c.begin(), c.end(), b.myset[i]);
if (it != c.end())
c.erase(it);
}
return Set(c);
}
Set SymmetricDifference(const Set& b) const {
std::vector<int64_t> c = this->Union(b).myset;
std::vector<int64_t> c_ = this->Intersection(b).myset;
for (size_t i = 0; i < c_.size(); i++) {
auto it = std::remove(c.begin(), c.end(), c_[i]);
c.erase(it);
}
return Set(c);
}
bool Contains(int64_t num) const {
if (std::find(myset.begin(), myset.end(), num) == myset.end())
return false;
else
return true;
}
void Add(int64_t num) {
auto last = std::unique(myset.begin(), myset.end());
myset.erase(last, myset.end());
if (!this->Contains(num))
myset.push_back(num);
}
void Remove(int64_t num) {
auto last = std::unique(myset.begin(), myset.end());
myset.erase(last, myset.end());
if (this->Contains(num)) {
auto it = std::remove(myset.begin(), myset.end(), num);
myset.erase(it);
}
}
std::vector<int64_t> Data() const {
return myset;
}
private:
std::vector<int64_t> myset;
};