Cod sursa(job #245555)

Utilizator AndreyPAndrei Poenaru AndreyP Data 18 ianuarie 2009 12:04:20
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#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;
}