Cod sursa(job #1067617)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 27 decembrie 2013 10:25:32
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 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;

#define MOD 666013

int n, l, u;

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

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

list< pair<unsigned, unsigned> > hash[MOD];
list< pair<unsigned, unsigned> >::iterator it2;

void clear_hash() {
	for(int i=0; i<MOD; ++i) hash[i].clear();
}

unsigned h(unsigned x) { return x%MOD; }

bool find(unsigned x) {
	int y = h(x);
	for(it2 = hash[y].begin(); it2!=hash[y].end(); ++it2)
		if(it2->first == x) return true;
	return false;
}

unsigned get(unsigned x) {
	int y = h(x);
	for(it2 = hash[y].begin(); it2!=hash[y].end(); ++it2)
		if(it2->first == x) return it2->second;
	return -1;
}

void insert(unsigned x, unsigned v) {
	int y = h(x);
	hash[y].push_back(make_pair(x, v));
}

void erase(unsigned x) {
	int y = h(x);
	for(it2 = hash[y].begin(); it2!=hash[y].end(); ++it2)
		if(it2->first == x) {
			hash[y].erase(it2);
			return;
		}	
}

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

		val = get(v[i]);
		if(val == -1) {
			++x;			
			insert(v[i], x);
			v[i] = x;			
			//printf("%d\n", v[i]);
		} 
		else {
			v[i] = val;
			//printf("%d\n", v[i]);
		}
	}

	clear_hash();
}

unsigned f(int x) { //nr secv cu cel mult x elem dist
	if(!x) return 0;
	unsigned ans = 0;
	
	int nr = 0, st = 1;
	unsigned val;
	for(int i=1; i<=n; ++i) {
		val = get(v[i]);
		
		if(val == -1) {
			insert(v[i], 1);
			++nr;
		}
		else {
			++val;
			erase(v[i]);
			insert(v[i], val);
		}

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

	clear_hash();
	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;
}