Cod sursa(job #352827)

Utilizator CezarMocanCezar Mocan CezarMocan Data 3 octombrie 2009 15:44:32
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define maxn 1100000
#define mod 131071

using namespace std;

unsigned int n, l, u, i, j, t, nr, ok;
char ss[11100000];
char *pp;
unsigned int v[maxn], vnou[maxn], ct[maxn];
vector <unsigned int> h[mod], x[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, 11000000, 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 < h[t].size(); j++)
			if (v[h[t][j]] == v[i]) {
				ok = 1;
				break;
			}
		if (ok == 0) {
			h[t].push_back(i);
			nr++;
			x[t].push_back(nr);
		}
	}

	for (i = 1; i <= n; i++) {
		t = (v[i] & mod);
		for (j = 0; j < h[t].size(); j++)
			if (v[h[t][j]] == v[i]) {
				vnou[i] = x[t][j];
				break;
			}
	}

	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);

/*	scanf("%lu%lu%lu ", &n, &l, &u);
	for (i = 1; i <= n; i++) {
		fgets(ss, 20, stdin);
		for (j = 0; ss[j] >= '0' && ss[j] <= '9'; j++)
			v[i] = v[i] * 10 + (ss[j] - 48);
	}*/
	read_data();

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

	return 0;
}