Cod sursa(job #352850)

Utilizator CezarMocanCezar Mocan CezarMocan Data 3 octombrie 2009 16:01:52
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define maxn 1100000
#define mod 266013

using namespace std;

unsigned int n, l, u, i, j, t, nr, ok;
char ss[12100000];
char *pp;
unsigned int v[maxn], vnou[maxn], ct[maxn], poz[maxn];
unsigned int h[mod][15], x[mod][15], ls[mod];

long long sol;

inline unsigned int read_value() {
	unsigned int val = 0;
	for (; '0' <= *pp && *pp <= '9'; pp++)
		val = val * 10 + *pp - '0';
	pp++;
	return val;
}

void read_data() {
	fread(ss, 1, 12000000, stdin);
	pp = ss;
	n = read_value(); l = read_value(); u = read_value();

	for (i = 1; i <= n; i++) {
		v[i] = read_value();
//		fprintf(stderr, "%d\n", v[i]);
	}
}

inline void norm() {
	for (i = 1; i <= n; i++) {
		t = (v[i] % mod);
//		fprintf(stderr, "%d %d   ", i, t);
		ok = 0;
		for (j = 0; j < ls[t]; j++)
			if (v[h[t][j]] == v[i]) {
				ok = 1;
				poz[i] = j;
				break;
			}
		if (ok == 0) {
			h[t][ls[t]] = i;
			poz[i] = ls[t];
			nr++;
			x[t][ls[t]] = nr;
			ls[t]++;
		}
	}

	for (i = 1; i <= n; i++) {
		t = (v[i] % mod);
		vnou[i] = x[t][poz[i]];
	}

	memcpy(v, vnou, sizeof(v));
}

inline unsigned long long baga(unsigned int x) {
	unsigned int l;
	long long sol = 0;
	if (x == 0)
		return 0;
	memset(ct, 0, sizeof(ct));

	l = 1; nr = 0;
	for (i = 1; i <= n; i++) {
		ct[v[i]]++;
		if (ct[v[i]] == 1)
			nr++;

		if (nr > x) {
			while (ct[v[l]] != 1 && l < i) {
				ct[v[l]]--;
				l++;
			}
			ct[v[l]]--; l++;
			nr--;
		}

		sol += (i - l + 1);

	}
	return sol;
}

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

	read_data();

	norm();
//	return 0;
	
	sol = baga(u) - baga(l - 1);
	printf("%lld\n", sol);

	return 0;
}