Pagini recente » Cod sursa (job #519690) | Cod sursa (job #196024) | Cod sursa (job #3249716) | Cod sursa (job #718683) | Cod sursa (job #2618679)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
const int nmax = 1048576, mod = 100003;
int n, l, u, v[nmax + 5];
vector <pair <int, int> > h[mod + 5];
int Find(int x)
{
int m = x % mod;
for (int i = 0; i < h[m].size(); ++i)
{
if (h[m][i].first == x) return i;
}
return -1;
}
void Add(int x)
{
int pos = Find(x);
int m = x % mod;
if (pos == -1)
{
h[m].push_back({x, 1});
}
else
{
h[m][pos].second++;
}
}
void Remove(int x)
{
int pos = Find(x);
int m = x % mod;
--h[m][pos].second;
if (h[m][pos].second == 0)
{
swap(h[m][pos], h[m][h[m].size() - 1]);
h[m].pop_back();
}
}
long long f(int x)
{
int st = 1;
int contor = 0;
long long ans = 0;
for (int dr = 1; dr <= n; ++dr)
{
if (Find(v[dr]) == -1) ++contor;
Add(v[dr]);
while (contor > x && st <= dr)
{
Remove(v[st]);
if (Find(v[st]) == -1) --contor;
++st;
}
ans = 1LL * ans + dr - st + 1;
}
while (st <= n)
{
Remove(v[st]);
++st;
}
return ans;
}
int main()
{
fin >> n >> l >> u;
for (int i = 1; i <= n; ++i)
{
fin >> v[i];
}
fout << f(u) - f(l - 1);
fin.close();
fout.close();
return 0;
}