显示原始代码
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
const int maxN = 2e5 + 10;
int a[maxN], num[1000010], res[maxN];
vector<tuple<int, int, int>> query(maxN);
void solve() {
memset(num, 0, sizeof(num));
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 0; i < q; i++) {
int l, r;
cin >> l >> r;
query[i] = make_tuple(l, r, i);
}
sort(query.begin(), query.begin() + q, [](const tuple<int, int, int>& a, const tuple<int, int, int>& b) {
if (get<0>(a) == get<0>(b))
return get<1>(a) < get<1>(b);
return get<0>(a) < get<0>(b);
});
int ans = 0;
for (int i = get<0>(query[0]); i <= get<1>(query[0]); i++) {
if (!num[a[i]])
ans++;
num[a[i]]++;
}
res[get<2>(query[0])] = ans;
for (int i = 1; i < q; i++) {
int r = min(get<1>(query[i - 1]), get<0>(query[i]) - 1);
for (int j = get<0>(query[i - 1]); j <= r; j++) {
num[a[j]]--;
if (!num[a[j]])
ans--;
}
int l = max(get<1>(query[i - 1]) + 1, get<0>(query[i]));
for (int j = l; j <= get<1>(query[i]); j++) {
if (!num[a[j]])
ans++;
num[a[j]]++;
}
res[get<2>(query[i])] = ans;
}
for (int i = 0; i < q; i++) cout << res[i] << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t;
t = 1;
while (t--) {
solve();
}
return 0;
}