Cod sursa(job #250929)

Utilizator AndreyPAndrei Poenaru AndreyP Data 1 februarie 2009 12:28:38
Problema Secventa 5 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.15 kb
#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;
}