Cod sursa(job #11355)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 31 ianuarie 2007 14:12:40
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <map>

using namespace std;

#define FOR(i,s,d) for(i=(s);i<(d);++i)

typedef unsigned int uint;
typedef long long lint;

uint n,A[1<<20],u,l;
map <lint,lint> H;
uint B[31][37][41][47];

uint Q(uint x)
{
	return B[x%31][x%37][x%41][x%47];	
}

uint P(uint x,uint z)
{
	B[x%31][x%37][x%41][x%47]+=z;	
}

lint doit(uint l)
{
	if(!l)
		return 0;
	uint i,j=0,nr=0;
	lint sol=0;
	FOR(i,0,n)
	{
		for(;nr<=l&&j<n;j++)
		{
			if(!Q(A[j]))
				nr++;
			else
				if(!H[A[j]])
					nr++;
			P(A[j],1);
			H[A[j]]++;
		}
		sol+=j-i-(nr<=l?0:1);
		P(A[i],-1);
		H[A[i]]--;
		if(!Q(A[i]))
			nr--;
		else
			if(!H[A[i]])
				nr--;
	}
	return sol;
}

char s[128];

uint cit()
{
	uint i,j=0;
	fgets(s,100,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;
	fgets(s,100,stdin);
	sscanf(s,"%u %u %u",&n,&u,&l);

	FOR(i,0,n)
//		scanf("%u",&A[i]);
		A[i]=cit();
	printf("%lld\n",doit(l)-doit(u-1));
	return 0;
}