Cod sursa(job #1067611)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 27 decembrie 2013 10:06:15
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>

#define INFL "secv5.in"
#define OUTFL "secv5.out"

using namespace std;

int n, l, u;

unsigned v[(1<<20)+1];

map<unsigned, int> H;
map<unsigned, int>::iterator it;

void read() {
	scanf("%d%d%d", &n, &l, &u);
	
	int x = 0;
	for(int i=1; i<=n; ++i) {
		scanf("%u", &v[i]);

		it = H.find(v[i]);
		if(it == H.end()) {
			++x;
			H[v[i]] = x;
			v[i] = x;
			//printf("%d\n", v[i]);
		} 
		else {
			v[i] = H[v[i]];
			//printf("%d\n", v[i]);
		}
	}

	H.clear();
}

unsigned f(int x) { //nr secv cu cel mult x elem dist
	if(!x) return 0;
	unsigned ans = 0;
	
	int nr = 0, st = 1;
	for(int i=1; i<=n; ++i) {
		it = H.find(v[i]);
		if(it == H.end()) {
			H[v[i]] = 1;
			++nr;
		}
		else ++H[v[i]];

		while( nr > x ) {
			--H[v[st]];
			if(!H[v[st]]) {
				H.erase(v[st]);
				--nr;
			}
			++st;
		}
		//printf("%d %d %d\n", st, i, nr);
		ans += (unsigned)(i-st+1);
	}

	H.clear();
	return ans;
}

void solve() {
	/*for (int i = 0; i < n; ++i)
	{
		printf("%d ", v[i+1]);
	} printf("\n");*/
	printf("%u", f(u) - f(l-1));
}

int main() {
//#define ONLINE_JUDGE 1
#ifndef ONLINE_JUDGE
	freopen(INFL, "r", stdin);
	freopen(OUTFL, "w", stdout);
#endif

	read();
	solve();
	
	return 0;
}