#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mask(i) (1LL << (i))
const int block = 710;
const int MAXN = 5e5 + 5;
const int MAXA = 2e5 + 51;
struct query
{
int l, r, id;
void in(int id)
{
this->id = id;
cin >> l >> r;
l--, r--;
}
bool operator<(query o) const
{
return make_pair(l / block, r) < make_pair(o.l / block, o.r);
}
};
int cnt[MAXN] = {}, f[MAXN];
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, qu;
cin >> n >> qu;
vector<int> v(n);
for (int& i : v) cin >> i;
vector<pair<int, int>> ve;
for (int i = 0; i < n; i++) ve.emplace_back(v[i], i);
sort(ve.begin(), ve.end());
v[ve[0].second] = 0;
for (int i = 1; i < n; i++)
{
if (ve[i].first == ve[i - 1].first) v[ve[i].second] = v[ve[i - 1].second];
else v[ve[i].second] = v[ve[i - 1].second] + 1;
}
vector<query> q(qu);
for (int i = 0; i < qu; i++) q[i].in(i);
sort(q.begin(), q.end());
cnt[0] = n;
auto add = [&](int pos)
{
cnt[f[v[pos]]]--;
f[v[pos]]++;
cnt[f[v[pos]]]++;
};
auto remove = [&](int pos)
{
cnt[f[v[pos]]]--;
f[v[pos]]--;
cnt[f[v[pos]]]++;
};
for (int i = 0; i < n; i++) add(i);
vector<int> ans(qu);
int l = 0, r = n - 1;
for (auto x : q)
{
while (x.l > l) remove(l++);
while (x.l < l) add(--l);
while (x.r > r) add(++r);
while (x.r < r) remove(r--);
ans[x.id] = cnt[2];
}
for (int i : ans) cout << i << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |