Cod sursa(job #710933)

Utilizator geobarosanu1Tutuianu George geobarosanu1 Data 11 martie 2012 00:29:38
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <vector>
using namespace std;
#define mod 666013
#define max 1<<20

vector < int > a,b;
vector < pair <unsigned int, int> > Hash[666014];
int N,L,U,viz[max];

int search(unsigned int);
void open_files(){

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

}
void read(){
	
	scanf("%d %d %d", &N, &L, &U);
	int norm=0;
	for (int i=0;i<N;++i){
		unsigned int x;
		scanf("%u", &x);
		a.push_back(x);

		int rez=search(x);
		if (rez==-1){
			int cheie=x%mod;
			Hash[cheie].push_back(make_pair(x,norm));
			b.push_back(norm++);
		}
		else {
			b.push_back(rez);
		}

	}

}
long long solve_subseq(int);
void write();
int main()
{
	
	open_files();
	read();
	write();

	return 0;
}

int search(unsigned int x){
	
	int cheie=x%mod;
	for (int i=0;i<Hash[cheie].size();++i){
		if (Hash[cheie][i].first==x)
			return Hash[cheie][i].second;
	}
	return -1;
}
long long solve_subseq(int x){

	/*for (int i=0;i<b.size();++i)
		viz[i]=0;*/
	memset(viz,0,max*sizeof(int));
	
	int nr=0,j=0,i=0;
	long long rez=0;

	for (;i<N;++i){
		if (!viz[b[i]])
			nr++;
		viz[b[i]]++;
		for (; nr > x; j++){
			viz[b[j]]--;
			if (!viz[b[j]])
				nr--;
		}

		rez+=i-j+1;

	}
	
	return rez;
}
void write(){

	printf("%lld", solve_subseq(U)-solve_subseq(L-1));

}