Pagini recente » Cod sursa (job #459448) | Cod sursa (job #1394658) | Cod sursa (job #1589245) | Cod sursa (job #2613713) | Cod sursa (job #2927053)
//sunt prostanac, uitai sa scad secventele care apar si dupa comprimare si inainte
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = (1 << 20) + 1;
long long v[NMAX];
pair <long long, int> a[NMAX];
int f[NMAX]; //sau hash fara normalizare I guess
int n;
int ind[NMAX];
long long solve(int val)
{
if (val == 0)
return 0;
int i, j;
long long ans = 0;
int last = -1, nr = 0;
for (i = j = 1; j <= n; j++)
{
if (f[ind[j]] == 0)
nr++;
f[ind[j]]++;
if (nr > val)
{
ans += 1LL * (j - i) * (j - i + 1) / 2 - 1LL * (last != -1) * (last - i) * (last - i + 1) / 2;
last = j;
while (i < j and nr > val)
{
if (f[ind[i]] == 1)
nr--;
f[ind[i]]--;
i++;
}
}
}
memset(f, 0, sizeof(f));
ans += 1LL * (j - i) * (j - i + 1) / 2 - 1LL * (last != -1) * (last - i) * (last - i + 1) / 2;
return ans;
}
signed main()
{
ifstream cin("secv5.in");
ofstream cout("secv5.out");
int i, l, u;
cin >> n >> l >> u;
for (i = 1; i <= n; i++)
{
cin >> v[i];
a[i] = {v[i], i};
}
sort(a + 1, a + n + 1);
int last = 1, cnt = 1;
for (i = 1; i <= n; i++)
{
if (a[i].first != a[last].first)
{
last = i;
cnt++;
}
ind[a[i].second] = cnt;
}
cout << solve(u) - solve(l - 1);
}