Cod sursa(job #10047)

Utilizator gcosminGheorghe Cosmin gcosmin Data 27 ianuarie 2007 20:44:19
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <map>
using namespace std;

#define NMAX ((1 << 20) + 100)
#define LL long long
#define MOD 100003

int N, L, U;

unsigned int a[NMAX];

map <unsigned int, int> H;

int nr[MOD];
unsigned int hash[MOD][20];
int nap[MOD][20];

LL baga(int lung)
{
	int i, p, nr = 0, q;

	LL rez = 0;

	p = 1;

	int aux;

	for (i = 1; i <= N; i++) {
		aux = ++H[a[i]];
		if (aux == 1) nr++;

		while (nr > lung) {
			q = a[p];
			aux = --H[q];
			if (!aux) nr--;
			p++;
		}

		rez += i - p + 1;		
	}
	
return rez;
}

int gen(int N, int L, int U)
{
	freopen("secv5.in", "w", stdout);

	printf("%d %d %d\n", N, L, U);

	int i;
	for (i = 1; i <= N; i++) printf("%d ", rand() % 400);
	printf("\n");

fclose(stdout);
return 0;
}

int main()
{
//	gen(1 << 20, 100, 10000);
	
	int i;
	
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);

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

	for (i = 1; i <= N; i++) scanf("%u", &a[i]);

	LL rez1 = baga(U);

	H.clear();

	LL rez2 = baga(L - 1);

	printf("%lld\n", rez1 - rez2);

fclose(stdin);
fclose(stdout);
return 0;
}