Pagini recente » Cod sursa (job #2762297) | Cod sursa (job #2640686) | Cod sursa (job #2445577) | Cod sursa (job #561412) | Cod sursa (job #1015033)
#include <cstdio>
#include <algorithm>
#define nmax (1<<20)+2
using namespace std;
struct element {
unsigned int val;
unsigned int pos;
};
element v[nmax];
unsigned int aparitii[nmax];
unsigned int n, l, u;
unsigned int a[nmax];
bool cmp(element a,element b) {
return a.val < b.val;
}
inline unsigned long long rezolvare(int p) {
unsigned long long sol = 0; unsigned int st=1, dr=0, apct=0;
for (int i=0; i<nmax; i++) aparitii[i] = 0;
while (dr <= n && apct<=p) if (++aparitii[a[++dr]] == 1) apct++;
sol += dr - st;
if (--aparitii[a[st]] == 0) apct--;
st++;
while (dr <= n) {
while (apct > p) {
sol += (unsigned long long)(dr-st);
if (--aparitii[a[st++]] == 0) apct--;
}
while (dr <= n && apct <= p) {
dr++;
if (++aparitii[a[dr]] == 1) apct++;
}
}
while (st <= n) {
sol += (unsigned long long)(dr-st);
st++;
}
return sol;
}
int main() {
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%u %u %u",&n,&l,&u);
for (int i=1; i<=n; ++i) {
scanf("%u",&a[i]);
v[i].val = a[i];
v[i].pos = i;
}
sort(v+1,v+n+1,cmp);
for (int i = 1; i<=n; i++) {
a[v[i].pos] = a[v[i-1].pos];
if (v[i].val != v[i-1].val) a[v[i].pos]++;
}
unsigned long long x = rezolvare(u);
unsigned long long y = rezolvare(l-1);
printf("%lld\n",x-y);
return 0;
}