Pagini recente » Cod sursa (job #1150721) | Cod sursa (job #2401478) | Cod sursa (job #2173926) | Cod sursa (job #2456222) | Cod sursa (job #250929)
Cod sursa(job #250929)
#include<stdio.h>
#define M 666013
//899981
struct list
{
unsigned int x;
int cnt1,cnt2;
list *next;
list()
{
cnt1=cnt2=0;
}
};
list *a[M],*b[M];
int v[1049000];
int unde,k1,k2;
unsigned int x;
int n,l,u;
long long rez;
void add1()
{
++k1;
list *aux=new list;
aux->x=x;
aux->cnt1=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 insert1()
{
unde=x%M;
if(a[unde]==NULL)
{
add1();
return;
}
if(a[unde]->x==x)
{
int &aux=a[unde]->cnt1;
if(!aux)
++k1;
++aux;
return;
}
list *aux=find();
if(aux==NULL)
{
add1();
return;
}
int &aux1=aux->next->cnt1;
if(!aux1)
++k1;
++aux1;
}
inline void sterge1()
{
unde=x%M;
if(a[unde]==NULL)
return;
if(a[unde]->x==x)
{
int &aux=a[unde]->cnt1;
if(!aux)
return;
--aux;
if(aux)
return;
else
{
--k1;
if(a[unde]->cnt2==0)
{
list *aux1=a[unde];
a[unde]=a[unde]->next;
delete aux1;
}
}
return;
}
list *aux=find();
if(aux==NULL)
return;
if(aux->next->cnt1==0)
return;
int &ref=aux->next->cnt1;
--ref;
if(ref)
return;
--k1;
if(aux->next->cnt2==0)
{
list *aux1=aux->next;
aux->next=aux->next->next;
delete aux1;
}
}
void add2()
{
++k2;
list *aux=new list;
aux->x=x;
aux->cnt2=1;
aux->next=a[unde];
a[unde]=aux;
}
inline void insert2()
{
unde=x%M;
if(a[unde]==NULL)
{
add2();
return;
}
if(a[unde]->x==x)
{
int &aux=a[unde]->cnt2;
if(!aux)
++k2;
++aux;
return;
}
list *aux=find();
if(aux==NULL)
{
add2();
return;
}
int &aux1=aux->next->cnt2;
if(!aux1)
++k2;
++aux1;
}
inline void sterge2()
{
unde=x%M;
if(a[unde]==NULL)
return;
if(a[unde]->x==x)
{
int &aux=a[unde]->cnt2;
if(!aux)
return;
--aux;
if(aux)
return;
else
{
--k2;
if(a[unde]->cnt1==0)
{
list *aux1=a[unde];
a[unde]=a[unde]->next;
delete aux1;
}
}
return;
}
list *aux=find();
if(aux==NULL)
return;
if(aux->next->cnt2==0)
return;
int &ref=aux->next->cnt2;
--ref;
if(ref)
return;
--k2;
if(aux->next->cnt1==0)
{
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 poz1=1,poz2=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;
insert1();
while(k1>l)
{
x=v[poz1++];
sterge1();
}
aux=poz1-i-1;
aux1=(long long)aux;
rez+=aux1;
insert2();
while(k2>u)
{
x=v[poz2++];
sterge2();
}
aux=i-poz2+1;
aux1=(long long)aux;
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;
}