Pagini recente » Cod sursa (job #1927960) | Cod sursa (job #2620429) | Cod sursa (job #337062) | Cod sursa (job #2668713) | Cod sursa (job #245401)
Cod sursa(job #245401)
#include<stdio.h>
#define M 666013
struct list
{
unsigned int x;
int cnt;
list *next;
};
list *a[M];
int v[1049000];
int unde,k;
unsigned int x;
int n,l,u;
long long rez;
void add()
{
++k;
list *aux=new list;
aux->x=x;
aux->cnt=1;
aux->next=a[unde];
a[unde]=aux;
}
list* find()
{
for(list *y=a[unde]; y->next!=NULL; y=y->next)
{
if(y->next->x==x)
return y;
}
return NULL;
}
inline void insert()
{
unde=x%M;
if(a[unde]==NULL)
add();
if(a[unde]->x==x)
{
++(a[unde]->cnt);
return;
}
list *aux=find();
if(aux==NULL)
return;
++(aux->next->cnt);
}
inline void sterge()
{
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();
if(aux==NULL)
return;
--k;
int ref=aux->next->cnt;
--ref;
if(ref)
return;
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,&l,&u);
int kant=0;
for(int i=1; i<=n; ++i)
{
scanf("%u",&x);
insert();
if(k!=kant)
{
kant=k;
v[++v[0]]=i;
}
}
v[++v[0]]=n+1;
int aux;
long long aux1;
int i=1,j1=l,j2=u+1;
for(; j2<=v[0]; ++i,++j1,++j2)
{
aux=(v[j2]-v[j1])*(v[i+1]-v[i]);
aux1=(long long)aux;
rez+=aux1;
}
for(; j1<v[0]; ++i,++j1)
{
aux=(v[v[0]]-v[j1])*(v[i+1]-v[i]);
aux1=(long long)aux;
rez+=aux;
}
printf("%lld\n",rez);
return 0;
}