Pagini recente » Cod sursa (job #1569801) | Cod sursa (job #1521429) | Cod sursa (job #3128483) | Cod sursa (job #2335668) | Cod sursa (job #331459)
Cod sursa(job #331459)
#include <stdio.h>
#define HASH 1234561
#define DIM 1<<20+5
struct numar {unsigned int x,n;} a[DIM];
struct nod {unsigned int x,n;
nod *urm;} *h[HASH];
unsigned int ap[DIM];
unsigned int n,l,u,m,nr,st;
long long unsigned nrt;
void add (unsigned int a,unsigned int b)
{
nod *p;
for (p=h[a]; p; p=p->urm)
if (p->x==b)
return ;
p=new nod;
p->x=b;
p->n=++m;
p->urm=h[a];
h[a]=p;
}
void read ()
{
unsigned int i;
scanf ("%u%u%u",&n,&l,&u);
for (i=1; i<=n; ++i)
{
scanf ("%u",&a[i].x);
add (a[i].x%HASH,a[i].x);
}
}
unsigned int find (unsigned int a,unsigned int b)
{
nod *p;
for (p=h[a]; p; p=p->urm)
if (p->x==b)
return p->n;
return 0;
}
void norm ()
{
unsigned int i;
for (i=1; i<=n; ++i)
a[i].n=find (a[i].x%HASH,a[i].x);
}
void clean ()
{
unsigned int i;
for (i=1; i<=m; ++i)
ap[i]=0;
nr=nrt=0;
st=1;
}
long long unsigned solve (unsigned int p)
{
unsigned int i;
clean ();
for (i=1; i<=n; ++i)
{
if (++ap[a[i].n]==1)
++nr;
for ( ; nr>p; ++st)
if (--ap[a[st].n]==0)
--nr;
nrt+=i-st+1;
}
return nrt;
}
int main ()
{
freopen ("secv5.in","r",stdin);
freopen ("secv5.out","w",stdout);
read ();
norm ();
printf ("%llu",solve (u)-solve (--l));
return 0;
}