Cod sursa(job #9921)

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

#define NMAX (1 << 20)
#define LL long long
#define MOD 666013

int N, L, U;

unsigned int a[NMAX];
unsigned int b[NMAX];
int md[NMAX];

short nr[MOD];
unsigned int hash[MOD][5];
int nap[MOD][5];

inline int get(unsigned int x, int poz, int add)
{
	int q = md[poz];
	int i;

	for (i = 0; i < nr[q]; i++) 
		if (hash[q][i] == x) return nap[q][i] += add;

	hash[q][nr[q]++] = x;
	return nap[q][nr[q] - 1] += add;
}

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

	LL rez = 0;

	p = 0;

	int aux;

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

		while (nr > lung) {
			aux = get(b[p], p, -1);
			if (!aux) nr--;
			p++;
		}

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

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

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

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

	LL rez1 = baga(U);

	memset(nap, 0, sizeof(nap));

	LL rez2 = baga(L - 1);

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

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