Pagini recente » Cod sursa (job #41919) | Cod sursa (job #2344682) | Cod sursa (job #569851) | Cod sursa (job #2335574) | Cod sursa (job #1144788)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
const int NMAX=( 1<<20 )+2;
int n, l, u;
unsigned int a[NMAX];
ifstream in( "secv5.in" );
ofstream out( "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 Citeste_frumos()
{
in >> n >> l >> u;
int i;
for (i=1; i<= n; ++i)
{
in >> a[i];
v[i].value = a[i];
v[i].position = i;
}
}
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;
}
inline void Rezolva_frumos()
{
Normalizare();
out << Query(u) - Query(l-1) << "\n";
}
int main()
{
Citeste_frumos();
Rezolva_frumos();
return 0;
}