//配列の数値が小さい順に0-indexedでナンバリングする(同種なら同じ値)
//配列を書き換えるので、必要ならばあらかじめ圧縮前の配列を別に保存しておく
template <typename T>
void press(vector<T> &A)
{
vector<T> sorted = A;
sort(sorted.begin(), sorted.end());
auto itr = unique(sorted.begin(), sorted.end());
sorted.erase(itr, sorted.end());
for (int i = 0; i < A.size(); i++)
A[i] = lower_bound(sorted.begin(), sorted.end(), A[i]) - sorted.begin();
return;
}