思路是二维数点求
l <= i <= r && l <= lst_i
的数量,不知道为什么寄了,还是说不能这样。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e6 + 5, INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int n, m, q;
int a[N], pos[N], lst[N];
int c[N];
void modify(int x, int v)
{
for(; x <= n; x += x & -x) c[x] += v;
}
int query(int x)
{
int res = 0;
for(; x; x -= x & -x) res += c[x];
return res;
}
int ans[N];
vector<array<int, 5>> event;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m >> q;
for(int i = 1; i <= n; i ++)
{
cin >> a[i], lst[i] = pos[a[i]], pos[a[i]] = i;
event.push_back({lst[i], 0, i});
}
for(int i = 1; i <= q; i ++)
{
int l, r;
cin >> l >> r;
event.push_back({r, 1, r, 1, i});
event.push_back({l - 1, 1, l - 1, 1, i});
event.push_back({l - 1, 1, r, -1, i});
event.push_back({r, 1, l - 1, -1, i});
}
sort(event.begin(), event.end());
for(auto evt : event)
{
if(evt[1] == 0) modify(evt[2], 1);
else ans[evt[4]] += evt[3] * query(evt[2]);
}
for(int i = 1; i <= q; i ++) cout << ans[i] << '\n';
return 0;
}