Cod sursa(job #10111)

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

#define NMAX (1 << 20)
#define LL long long
#define MOD1 4999999
#define MOD2 1399999
#define MOD3 1999993
#define NMOD 3

int N, L, U, MD;

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

int nap[NMAX];
int nap1[NMAX];

int MOD[] = {MOD1, MOD2, MOD3};

unsigned int hash[NMOD][MOD1];
int jeg[NMOD][MOD1];

int main()
{
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);

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

	LL rez = 0;

	p = 0;
	q = 0;

	char s[20];

	int kkt = 0;

	for (i = 0; i < N; i++) {
		fgets(s, 20, stdin);
		for (j = 0; '0' <= s[j] && s[j] <= '9'; j++) a[i] = a[i] * 10 + s[j] - '0';

		for (j = 0; j < NMOD; j++) {
			MD = a[i] % MOD[j];

			if (!hash[j][MD]) {
//				oc[j][MD] = 1;
				pz[i] = kkt;
				hash[j][MD] = a[i];
				jeg[j][MD] = kkt;
				kkt++;
				break;
			}
			
			if (hash[j][MD] == a[i]) {
				pz[i] = jeg[j][MD];
				break;
			}
		}

		if (j == NMOD) while (1);

		nr += ++nap[pz[i]] == 1;
		nr1 += ++nap1[pz[i]] == 1;

		for (; nr > lung; nr -= --nap[pz[p]] == 0, p++);
		for (; nr1 > lung1; nr1 -= --nap1[pz[q]] == 0, q++);

		rez += q - p;
	}

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

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