Pagini recente » Istoria paginii runda/emag_2016-incepatori-4/clasament | 08022000 | Cod sursa (job #534450) | Istoria paginii runda/oni2011_9_2/clasament | Cod sursa (job #2849061)
#include <bits/stdc++.h>
#define nmax 1005000
#define int long long
using namespace std;
int v[nmax + 1], c[nmax + 1], cpart[nmax + 1];
map<int, int> fst, fdr;
signed main()
{
ifstream cin("secv5.in");
ofstream cout("secv5.out");
int n, l, u, p = 0, a, i, st, dr, cnt = 0;
cin >> n >> l >> u;
for (i = 1; i <= n; i++)
{
cin >> a;
if (a == v[p])
c[p]++;
else
++p, v[p] = a, c[p] = 1;
}
n = p;
if (l == 1)
{
l++;
for (i = 1; i <= n; i++)
cnt += c[i] * (c[i] + 1) / 2;
}
for (i = 1; i <= n; i++)
cpart[i] = cpart[i - 1] + c[i];
cpart[n + 1] = cpart[n];
st = 0, dr = 0;
// fst[v[1]]++, fdr[v[1]]++;
if (l <= u)
for (i = 1; i <= n; i++)
{
while (st < n && fst.size() < l)
fst[v[++st]]++;
while (dr < n && fdr.size() < u)
fdr[v[++dr]]++;
// cout << st << " " << dr << " " << max(cpart[dr] - cpart[st - 1], 1LL) * c[i] << endl;
if (fdr.size() >= l && fdr.size() <= u)
if (dr != i)
cnt += max(cpart[dr] - cpart[st - 1], 1LL) * c[i];
else
cnt += c[i] * (c[i] + 1) / 2;
fst[v[i]]--, fdr[v[i]]--;
if (fst[v[i]] == 0)
fst.erase(v[i]);
if (fdr[v[i]] == 0)
fdr.erase(v[i]);
}
cout << cnt;
return 0;
}