Pagini recente » Cod sursa (job #1324589) | Cod sursa (job #452728) | Istoria paginii runda/tema33 | Cod sursa (job #1977513) | Cod sursa (job #995252)
Cod sursa(job #995252)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX (1<<20)+2
using namespace std;
int n, l, u;
unsigned int a[NMAX];
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 Read()
{
ifstream f ("secv5.in");
f>>n>>l>>u;
int i;
for (i=1; i<=n; ++i)
{
f>>a[i];
v[i].value = a[i];
v[i].position = i;
}
f.close();
}
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 Solve()
{
Normalizare();
ofstream g ("secv5.out");
g<<Query(u) - Query(l-1)<<"\n";
g.close();
}
int main()
{
Read();
Solve();
return 0;
}