Cod sursa(job #120627)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 6 ianuarie 2008 00:08:13
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>

#define fin  "secv5.in"
#define fout "secv5.out"

#define DBxG
#define FL

const int Mod  = 672331;
const int Nmax = 1111100;

struct inf 	{ 
				unsigned int val;
				int id;
			 	inf *next; 
			};

inf *hash[Mod];
int N,U,L,K;
unsigned int v[Nmax];
long long ret;
int frcv1[Nmax],frcv2[Nmax];

void readdata()
{
	int i,j;
	char buff[1024];
	unsigned int nr;

	freopen(fin,"r",stdin);

	scanf("%d%d%d",&N,&L,&U);
	
	nr = 0;

	j=0;

	while ( ! feof(stdin) )
	{
		fread(buff,1,1024,stdin);
		for (i=0;i<1024;++i)
		{
			if ( '0' <= buff[i] && buff[i] <= '9' )
				nr = nr * 10 + buff[i] - '0';
			else
			{
				if (nr)
					v[++j]=nr;
				nr=0;		
			}
		}
	}	
}

void inithash()
{
	int i;

	for (i=0;i<Mod;++i)
	{
		hash[i] = new inf;
		hash[i] -> next = NULL;
	}
}

void insert(int p)
{
	inf *it,*nou;

	it = hash[v[p] % Mod];

	while ( it -> next != NULL )
	{
		if ( it -> next -> val == v[p] )
		{
			v[p] = it -> next -> id;
			return ;
		}
		it = it -> next;
	}	

	if ( it -> next == NULL )
	{
		nou = new inf;

		nou -> val = v[p];
		nou ->  id = ++K;
		nou -> next= NULL;

		v[p] = K;

		it -> next = nou;
	}
}

void normalizeaza()
{
	int i;

	inithash();
	
	for (i=1;i<=N;++i)
		insert(i);

#ifdef DBG
	for (i=1;i<=N;++i)
		printf("%u ",v[i]);
	printf("\n");
#endif

}

void solve()
{
	int i,st,dr,cnt1,cnt2;

	st=1;
	dr=1;
	cnt1=cnt2=0;

	for (i=1;i<=N;++i)
	{
		++frcv1[ v[i] ];
		++frcv2[ v[i] ];

		if ( frcv1[v[i]] == 1 )
			++cnt1;
		if ( frcv2[v[i]] == 1 )
			++cnt2;

		while ( cnt1 > U )
		{
			--frcv1[ v[st] ];
			if ( frcv1[ v[st] ] == 0 )
				--cnt1;
			++st;
		}

		while ( cnt2 >= L )
		{
			--frcv2[ v[dr] ];
			if ( frcv2[ v[dr] ] == 0 )
				--cnt2;
			++dr;
		}

		if ( dr > st ) 
			ret = ret + dr - st;
	}

#ifdef FL
	freopen(fout,"w",stdout);
#endif

	printf("%lld\n",ret);
}

int main()
{
	readdata();
	normalizeaza();
	solve();
	return 0;
}