Cod sursa(job #12165)

Utilizator love_for_uSpancioc Riana love_for_u Data 3 februarie 2007 00:33:26
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMAX 666014
#define MMAX 1 << 21
#define MOD 666013
#define PB push_back
#define MP make_pair

using namespace std;

vector < pair <unsigned int, int> > H[NMAX];

unsigned int A[MMAX];
unsigned int St[MMAX], Used[MMAX], elem;
int N, i, nr = 0, s1, s2, num = 0;
int u, l;
long long ru, rl;

int hash (unsigned int x)
{
	vector < pair <unsigned int, int> > :: iterator it;
	int t = x % MOD;
	
	for (it = H[t].begin(); it != H[t].end(); it++)
		if (it->first == x) return (it->second);

	H[t].PB( MP(x, ++nr) );
		
	return nr;
}

void add(unsigned int elem, int Limit, long long &sol)
{
	St[s2] = elem;

	if (Used[elem] == 0) num ++; 
	
	Used[elem]++;
	
	if (num > Limit)
	{
		for (; s1 <= s2 && num > Limit; s1++)
		{
			Used[St[s1]] --;
			
			if (Used[St[s1]] == 0) num--;
		}
	}
		
	sol = (long long)sol + s2 + 1 - s1;
	
	s2++;
}
	   
		
		
int main()
{
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);
	
	scanf("%d %d %d", &N, &l, &u);
	
	for (i = 1; i <= N; i++)
	{
		scanf("%ud", &elem);
		
		A[i] = hash(elem);
	}
	
	
	/*for (i = 1; i <= N; i++) printf("%d ", A[i]);
	printf("\n"); */
	
	s1 = s2 = 1;
	
	for (i = 1; i <= N; i++) add(A[i], l-1, rl);
	
	s1 = s2 = 1;
	
	memset(Used, 0, sizeof(Used));
	//memset(St, 0, sizeof(St));
	
	num = 0;
	
	for (i = 1; i <= N; i++) add(A[i], u, ru);
	
	printf("%lld\n", ru - rl);
	
	return 0;
}