Pagini recente » Cod sursa (job #1672114) | Cod sursa (job #1251328) | Cod sursa (job #893578) | Cod sursa (job #2009811) | Cod sursa (job #245594)
Cod sursa(job #245594)
#include<stdio.h>
#define M 899981
struct list
{
unsigned int x;
int cnt;
list *next;
};
list *a[M],*b[M];
int v[1049000];
int unde,k1,k2;
unsigned int x;
int n,l,u;
long long rez;
void add(list *a[M],int &k)
{
++k;
list *aux=new list;
aux->x=x;
aux->cnt=1;
aux->next=a[unde];
a[unde]=aux;
}
list* find(list *a[M],int &k)
{
for(list *y=a[unde]; y->next!=NULL; y=y->next)
{
if(y->next->x==x)
return y;
}
return NULL;
}
inline void insert(list *a[M],int &k)
{
unde=x%M;
if(a[unde]==NULL)
{
add(a,k);
return;
}
if(a[unde]->x==x)
{
int &aux=a[unde]->cnt;
++aux;
return;
}
list *aux=find(a,k);
if(aux==NULL)
{
add(a,k);
return;
}
int &aux1=aux->next->cnt;
++aux1;
}
inline void sterge(list *a[M],int &k)
{
unde=x%M;
if(a[unde]==NULL)
return;
if(a[unde]->x==x)
{
int &aux=a[unde]->cnt;
--aux;
if(aux)
return;
else
{
--k;
//list *aux1=a[unde];
a[unde]=a[unde]->next;
//delete aux1;
}
return;
}
list *aux=find(a,k);
if(aux==NULL)
return;
int &ref=aux->next->cnt;
--ref;
if(ref)
return;
--k;
//list *aux1=aux->next;
aux->next=aux->next->next;
//delete aux1;
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%d%d%d\n",&n,&l,&u);
--l;
int poz=1;
int aux;
long long aux1;
char c[20];
for(int i=1; i<=n; ++i)
{
fgets(c,20,stdin);
x=0;
for(int j=0; '0'<=c[j] && c[j]<='9'; ++j)
x=x*10+c[j]-'0';
v[i]=x;
insert(a,k1);
while(k1>l)
{
x=v[poz++];
sterge(a,k1);
}
aux=poz-i-1;
aux1=(long long)aux;
//rez1+=aux1;
rez+=aux1;
}
poz=1;
for(int i=1; i<=n; ++i)
{
x=v[i];
insert(b,k2);
while(k2>u)
{
x=v[poz++];
sterge(b,k2);
}
aux=i-poz+1;
aux1=(long long)aux;
//rez2+=aux1;
rez+=aux1;
}
printf("%lld\n",rez);
return 0;
}