Pagini recente » Cod sursa (job #325477) | Cod sursa (job #983787) | Cod sursa (job #2759360) | Cod sursa (job #1048508) | Cod sursa (job #1159149)
#include <iostream>
#include <fstream>
#include <algorithm>
#define Nmax 1000000
using namespace std;
int n, l, u;
int a[Nmax];
ifstream fin( "secv5.in" );
ofstream fout( "secv5.out" );
struct norm
{
unsigned int value;
int position;
bool operator <(const norm &A) const
{
return value < A.value;
}
};
norm v[Nmax];
int frecv[Nmax];
inline void Normalizare()
{
sort(v+1, v+n+1);
for (int i = 1; i<=n; ++i)
a[v[i].position] = a[v[i-1].position] + !(v[i].value == v[i-1].value);
}
inline long long Query(int p)
{
long long sol = 0LL;
for (int i=0; i<Nmax; i++)
frecv[i] = 0;
int st, dr, cnt;
st = 1;
dr = 0;
cnt = 0;
while (dr <= n && cnt<=p)
{
++dr;
if (++frecv[a[dr]] == 1)
++cnt;
}
sol += dr - st;
if (--frecv[a[st]] == 0)
--cnt;
++st;
while (dr<=n)
{
while (cnt>p)
{
sol += dr-st;
if (--frecv[a[st]] == 0)
--cnt;
++st;
}
while (dr<=n && cnt<=p)
{
++dr;
if (++frecv[a[dr]] == 1)
++cnt;
}
}
while (st<=n)
{
sol += dr-st;
++st;
}
return sol;
}
int main()
{
fin >> n >> l >> u;
int i;
for (i=1; i<= n; ++i)
{
fin >> a[i];
v[i].value = a[i];
v[i].position = i;
}
Normalizare();
fout << Query(u) - Query(l-1);
return 0;
}