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