/* Problem URL: https://cses.fi/problemset/task/1734 */ #include using namespace std; #define V vector #define rmin(a, b) a = min(a, b) #define rmax(a, b) a = max(a, b) #define rep(i, lim) for (size_t i = 0; i < (lim); i++) #define nrep(i, s, lim) for (size_t i = s; i < (lim); i++) #define repv(i, v) for (auto &i : (v)) #define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } #define sortv(v) sort(v.begin(), v.end()) #define all(v) (v).begin(), (v).end() using vi = vector; using vvi = vector; using vvvi = vector; using vvvvi = vector; using ll = long long; using vl = vector; using vvl = vector; using vvvl = vector; using vvvvl = vector; template auto operator<<(ostream &os, const vector &vec)->ostream& { os << vec[0]; for (size_t i = 1; i < vec.size(); i++) { os << ' ' << vec[i]; } os << '\n'; return os; } template auto operator>>(istream &is, vector &vec)->istream& { for (auto &i : vec) { is >> i; } return is; } template auto operator<<(ostream &os, const vector> &vec)->ostream& { for (auto &i : vec) { os << i[0]; for (size_t j = 1; j < i.size(); j++) { os << ' ' << i[j]; } os << '\n'; } return os; } template auto operator>>(istream &is, vector> &vec)->istream& { for (auto &i : vec) { for (auto &j : i) { is >> j; } } return is; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; vl tmp(n); cin >> tmp; vl fds(n); set nums; rep(i, n) { nums.insert(tmp[i]); } int v = 0; map var; repv(i, nums) { var[i] = v; v++; } rep(i, n) { fds[i] = var[tmp[i]]; } int len = (int)sqrt(n) + 1; vi prev(n, -1); vi next(n, n); vl blocks(len, 0); V uniq(n, false); rep(i, n) { if (prev[fds[i]] == -1) { uniq[i] = true; prev[fds[i]] = i; blocks[i / len]++; continue; } next[prev[fds[i]]] = i; prev[fds[i]] = i; } V> query(q); size_t act = 0; for (auto &[l, r, i] : query) { cin >> l >> r; l--, r--; i = act; act++; } sortv(query); int ql = 0; vl ans(q); for (auto [l, r, i] : query) { while (ql < l) { blocks[ql / len]--; uniq[next[ql]] = true; blocks[next[ql] / len]++; ql++; } if (l / len == r / len) { ll sum = 0; for (size_t i = l; i <= r; i++) { if (uniq[i]) { sum++; } } ans[i] = sum; continue; } ll sum = 0; int bl = l / len; int br = r / len; for (int i = l, end = (bl + 1) * len - 1; i <= end; i++) { if (uniq[i]) { sum++; } } for (int i = bl + 1; i <= br - 1; i++) { sum += blocks[i]; } for (int i = br * len; i <= r; i++) { if (uniq[i]) { sum++; } } ans[i] = sum; } rep(i, q) { cout << ans[i] << '\n'; } }