Cod sursa(job #496140)

Utilizator ZethpixZethpix Zethpix Data 27 octombrie 2010 21:02:55
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>

struct hash
{
	int nod;
	hash *link;
}*H[1000000];

long n,a,b,m,i,x,x1,x2,sol,d[1100000],max[1100000],min[1100000];

void add(long x)
{
	hash *p;
	p=new hash;
	p->nod=x;
	p->link=H[x%m];
	H[x%m]=p;
}

int src(long x)
{
	hash *p;
	p=H[x%m];
	int ok=0;
	while(p!=NULL)
	{
		if(p->nod==x)
		{
			ok=1;
			break;
		}
		p=p->link;
	}
	return ok;
}

int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);

	scanf("%ld%ld%ld",&n,&a,&b);
	m=999983;
	for(i=1;i<=m;i++) H[i]=NULL;
	d[0]=0;
	for(i=1;i<=n;i++)
	{
		scanf("%ld",&x);
		if(src(x)==0)
		{
			d[i]=d[i-1]+1;
			add(x);
		}
		else d[i]=d[i-1];
	}

	for(i=1;i<=n;i++)
	{
		max[i]=0;
		min[i]=2000000000;
	}
	for(i=1;i<=n;i++)
	{
		if(max[d[i]]<i) max[d[i]]=i;
		if(min[d[i]]>i) min[d[i]]=i;
	}
	sol=0;
	for(i=1;i<=n;i++)
	{
		x=d[n]-d[i]+1;
		if(x<a) break;
		x1=max[a+d[i]-1];
		x2=max[b+d[i]-1];
		if(b+d[i]-1>d[n])
		{
			if(min[a+d[i]-1]<x1) x1=min[a+d[i]-1];
			x2=n;
			sol+=x2-x1+1;
			break;
		}
		sol+=x2-x1+1;
	}

	printf("%ld\n",sol);
	return 0;
}