Cod sursa(job #9980)

Utilizator gcosminGheorghe Cosmin gcosmin Data 27 ianuarie 2007 19:55:52
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <string.h>
using namespace std;

#define NMAX (1 << 20)
#define LL long long
#define MOD 1999993
#define SZ 5

int N, L, U, MD;

unsigned int a[NMAX];
char pz[NMAX];

char nr[MOD];
unsigned int hash[SZ][MOD];
int nap[SZ][MOD];

int nap1[SZ][MOD];

void baga_hash(unsigned x, int poz)
{
	int i;

	for (i = 0; i < nr[MD]; i++)
		if (hash[i][MD] == x) {
			pz[poz] = i;
			return;
		}

	pz[poz] = nr[MD];
	hash[nr[MD]++][MD] = x;
}

#include <stdlib.h>
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);
	
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);

	scanf("%d %d %d", &N, &L, &U);
	
	int i;
	int lung = U, lung1 = L - 1;
	
	int p, nr = 0, q, nr1 = 0;

	LL rez = 0;

	p = 0;
	q = 0;

	int aux, md;

	for (i = 0; i < N; i++) {
		scanf("%u", &a[i]);
		MD = a[i] % MOD;

		baga_hash(a[i], i);

		aux = ++nap[pz[i]][MD];
		if (aux == 1) nr++;

		aux = ++nap1[pz[i]][MD];
		if (aux == 1) nr1++;

		while (nr > lung) {
			aux = --nap[pz[p]][a[p] % MOD];
			if (!aux) nr--;
			p++;
		}

		while (nr1 > lung1) {
			aux = --nap1[pz[q]][a[q] % MOD];
			if (!aux) nr1--;
			q++;				
		}

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

	printf("%lld\n", rez);
	

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