This documentation is automatically generated by online-judge-tools/verification-helper
template <typename T>
class Compress {
vector<T> xs;
public:
Compress() = default;
explicit Compress(const vector<T> &vs) { add(vs); }
explicit Compress(const initializer_list<vector<T>> &vs) {
for (const auto &p : vs)
add(p);
}
void add(const vector<T> &vs) {
copy(begin(vs), end(vs), back_inserter(xs));
}
void add(const T &x) { xs.emplace_back(x); }
void build() {
sort(begin(xs), end(xs));
xs.erase(unique(begin(xs), end(xs)), end(xs));
}
vector<int> get(const vector<T> &vs) const {
vector<int> ret;
transform(begin(vs), end(vs), back_inserter(ret), [&](const T &x) {
return lower_bound(begin(xs), end(xs), x) - begin(xs);
});
return ret;
}
int get(const T &x) const {
return lower_bound(begin(xs), end(xs), x) - begin(xs);
}
const T &operator[](const int k) const { return xs[k]; }
};
#line 1 "others/compress.cpp"
template <typename T>
class Compress {
vector<T> xs;
public:
Compress() = default;
explicit Compress(const vector<T> &vs) { add(vs); }
explicit Compress(const initializer_list<vector<T>> &vs) {
for (const auto &p : vs)
add(p);
}
void add(const vector<T> &vs) {
copy(begin(vs), end(vs), back_inserter(xs));
}
void add(const T &x) { xs.emplace_back(x); }
void build() {
sort(begin(xs), end(xs));
xs.erase(unique(begin(xs), end(xs)), end(xs));
}
vector<int> get(const vector<T> &vs) const {
vector<int> ret;
transform(begin(vs), end(vs), back_inserter(ret), [&](const T &x) {
return lower_bound(begin(xs), end(xs), x) - begin(xs);
});
return ret;
}
int get(const T &x) const {
return lower_bound(begin(xs), end(xs), x) - begin(xs);
}
const T &operator[](const int k) const { return xs[k]; }
};