Pagini recente » Cod sursa (job #2086764) | Cod sursa (job #1760350) | Cod sursa (job #1213487) | Cod sursa (job #1097491) | Cod sursa (job #245555)
Cod sursa(job #245555)
#include<stdio.h>
#define M 666013
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;
int 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=i-poz+1;
//aux1=(long long)aux;
//rez1+=aux1;
rez+=poz-i-1;
}
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+=i-poz+1;
}
printf("%d\n",rez);
return 0;
}