This documentation is automatically generated by online-judge-tools/verification-helper
#include "other/compress.hpp"
template <typename T>
struct Compress {
vector<T> xs;
Compress() = default;
Compress(const vector<T> &vs) { add(vs); }
Compress(const initializer_list<vector<T> > &vs) {
for (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[](int k) const { return xs[k]; }
};
#line 1 "other/compress.hpp"
template <typename T>
struct Compress {
vector<T> xs;
Compress() = default;
Compress(const vector<T> &vs) { add(vs); }
Compress(const initializer_list<vector<T> > &vs) {
for (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[](int k) const { return xs[k]; }
};