Cod sursa(job #352814)

Utilizator CezarMocanCezar Mocan CezarMocan Data 3 octombrie 2009 15:22:54
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define maxn 1100000
#define mod 666013

using namespace std;

int n, l, u, i, j, t, nr, ok;
char ss[15100000];
char *pp;
int v[maxn], vnou[maxn], sol, ct[maxn];
vector <int> h[mod], x[mod];

inline int read_value() {
	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 int baga(int x) {
	int l, 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++;
//		fprintf(stderr, "%d %d   ", ct[v[i]], nr);

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

		sol += (i - l + 1);

//		fprintf(stderr, "%d  %d %d %d\n", x, i, l, nr);
	
	}
	return sol;
}

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

	read_data();
	norm();
	
//	printf("%d %d   %d %d\n", u, baga(u), l - 1, baga(l - 1));

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

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

	return 0;
}