CP-templates

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Misuki743/CP-templates

:heavy_check_mark: ds_problem/rangeCountDistinct.cpp

Verified with

Code

//#include<ds/fenwickTree.cpp>
//#include<misc/compression.cpp>

template<class T>
vector<int> rangeCountDistinct(vector<T> a, vector<array<int, 2>> query) {
  vector<int> b = [&]() {
    compression ys(a);
    return ys.ord;
  }();

  vector<int> qId(ssize(query));
  iota(qId.begin(), qId.end(), 0);
  ranges::sort(qId, less<int>{}, [&](auto &i) { return query[i][1]; });

  fenwickTree<int> ft(ssize(a));
  vector<int> ans(ssize(query)), pos(ssize(b), -1);
  for(int ptr = 0; int i : qId) {
    auto [l, r] = query[i];
    if (l == r) continue;
    while(ptr < r) {
      ft.add(pos[b[ptr]] + 1, 1);
      ft.add(ptr + 1, -1);
      pos[b[ptr]] = ptr, ptr++;
    }
    ans[i] = ft.query(l);
  }

  return ans;
}
#line 1 "ds_problem/rangeCountDistinct.cpp"
//#include<ds/fenwickTree.cpp>
//#include<misc/compression.cpp>

template<class T>
vector<int> rangeCountDistinct(vector<T> a, vector<array<int, 2>> query) {
  vector<int> b = [&]() {
    compression ys(a);
    return ys.ord;
  }();

  vector<int> qId(ssize(query));
  iota(qId.begin(), qId.end(), 0);
  ranges::sort(qId, less<int>{}, [&](auto &i) { return query[i][1]; });

  fenwickTree<int> ft(ssize(a));
  vector<int> ans(ssize(query)), pos(ssize(b), -1);
  for(int ptr = 0; int i : qId) {
    auto [l, r] = query[i];
    if (l == r) continue;
    while(ptr < r) {
      ft.add(pos[b[ptr]] + 1, 1);
      ft.add(ptr + 1, -1);
      pos[b[ptr]] = ptr, ptr++;
    }
    ans[i] = ft.query(l);
  }

  return ans;
}
Back to top page