Cod sursa(job #11987)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 2 februarie 2007 16:03:35
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <string.h>

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define RS 131071
#define SL 16
#define SR 16

typedef unsigned int uint;
typedef long long lint;

uint n,A[1<<20],u,l;
int H[RS+1][SR];
short int B[1<<21];

lint doit(uint l)
{	
	if(!l)
		return 0;
	uint i,j=0,nr=0;
	lint sol=0;
	uint *p=A;
	FOR(i,0,n)
	{
		for(;nr<=l&&j<n;j++,p++)
		{
//			if(!H[(*p)>>5][(*p)&31])
			if(!B[(*p)])
				nr++;
			B[*p]++;
//			++H[(*p)>>5][(*p)&31];
		}
		sol+=j-i-(nr<=l?0:1);
//		if(!(--H[A[i]>>5][A[i]&31]))
		if(!(--B[A[i]]))
			nr--;
	}
	return sol;
}

char s[64];

uint cit()
{
	uint i,j=0;
	fgets(s,64,stdin);
	for(i=0;s[i]>='0'&&s[i]<='9';i++)
		j=j*((uint)10)+((uint)(s[i]-'0'));
	return j;
}

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

	int i,j=0,jj;
	uint x,y;
	uint xx;
	fgets(s,64,stdin);
	sscanf(s,"%u %u %u",&n,&u,&l);

	FOR(i,0,n)
	{
		xx=cit();
		x=xx>>SL,y=(xx&RS);
		x++;
		FOR(jj,0,SR)
			if(H[y][jj]==x||!H[y][jj])
				break;	
		if(!H[y][jj])
			H[y][jj]=x;
		A[i]=((y<<4)|(jj));
	}
//	memset(H,0,sizeof(H));

	printf("%lld\n",doit(l)-doit(u-1));
	return 0;
}