Pagini recente » Cod sursa (job #1415221) | Cod sursa (job #2498026) | Cod sursa (job #2378181) | Cod sursa (job #1392666) | Cod sursa (job #1015000)
#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]++;
}
printf("%d\n",rezolvare(u) - rezolvare(l-1));
return 0;
}