Pagini recente » Cod sursa (job #2780840) | Cod sursa (job #18656) | Cod sursa (job #3288906) | Cod sursa (job #1933239) | Cod sursa (job #1674249)
#include <cstdio>
#include <iostream>
#include <unordered_set>
#include <vector>
using namespace std;
const int MOD = 666013;
class Hash
{
vector< pair<int, int> > v[MOD+10];
public:
void insert(int x)
{
int i = x % MOD;
bool found = false;
for (auto &it: v[i])
if (it.first == x)
{
found = true;
it.second++;
break;
}
if (!found)
v[i].push_back(make_pair(x, 1));
}
void erase(int x)
{
int i = x % MOD;
for (int j = 0; j < v[i].size(); j++)
if (v[i][j].first == x)
{
v[i][j].second--;
if (v[i][j].second == 0)
v[i].erase(v[i].begin() + j);
break;
}
}
int count(int x)
{
int i = x % MOD;
for (auto &it: v[i])
if (it.first == x)
return it.second;
return 0;
}
};
Hash h1, h2;
unsigned v[2000000];
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
int n, l, u;
scanf("%d%d%d", &n, &l, &u);
int l1 = 1;
int l2 = 1;
int nr1 = 0, nr2 = 0;
long long sol = 0;
for (int i = 1; i <= n; i++)
{
scanf("%u", &v[i]);
if (h1.count(v[i]) == 0)
nr1++;
if (h2.count(v[i]) == 0)
nr2++;
if (nr1 > u)
{
for (; l1 <= n; l1++)
{
h1.erase(v[l1]);
if (h1.count(v[l1]) == 0)
break;
}
l1++;
nr1--;
}
if (nr2 > l)
{
for (; l2 <= n; l2++)
{
h2.erase(v[l2]);
if (h2.count(v[l2]) == 0)
break;
}
l2++;
nr2--;
}
h1.insert(v[i]);
h2.insert(v[i]);
while (h2.count(v[l2]) > 1 && l2 < i)
{
h2.erase(v[l2]);
l2++;
}
if (nr1 >= l)
sol += (l2 - l1 + 1);
}
cout << sol << '\n';
return 0;
}