Cod sursa(job #683009)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 19 februarie 2012 20:43:14
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<cstdio>
#include<list>
#include<vector>
#define MOD 30773
#define U unsigned
using namespace std;

struct per {U x, fr;};
list <per> H[MOD];
vector <U> v;
char buff[32768];
U n, l, u, nr, poz;

void Check(){
	if (++poz == 32768) poz = 0, fread(buff, 1, 32768, stdin);
}

void Read(U &nr){
	nr = 0;
	while(buff[poz] < '0' || buff[poz] > '9') Check();
	while(buff[poz] >= '0' && buff[poz] <= '9'){
		nr = nr * 10 + buff[poz] - '0';
		Check();
	}
}

bool inHash(U x, int add){
	list <per> :: iterator it;
	for (it = H[x % MOD].begin(); it != H[x % MOD].end(); it++)
		if (it->x == x) {
			it->fr += add;
			if (it->fr == 0) {
				H[x % MOD].erase(it);
				return false;
			}
			return true;
		}
	if (add == 1) H[x % MOD].push_back((per){x, 1});
	return false;
}

long long Subs(U N){		//nr de subs cu maxim N nr distincte
	U i, j; long long nSub;
	
	for(i = j = nSub = nr = 0; i < n; i++){
		if(!inHash(v[i], 1)) nr++;
		
		while(nr > N)
			if (!inHash(v[j++], -1)) nr--;
		nSub += i - j + 1;
	}
	
	while(j < n) 
		if (!H[v[j++] % MOD].empty()) H[v[j-1] % MOD].pop_front();			//curat hashul
	return nSub;
}

int main(){
	freopen("secv5.in", "r", stdin), freopen("secv5.out", "w", stdout);
	fread(buff, 1, 32768, stdin);
	Read(n), Read(l), Read(u);
	U i, x;
	
	for(i = 0; i < n; i++)
		Read(x), v.push_back(x);
	
	printf("%lld\n", Subs(u) - Subs(l-1));
	return 0;
}