Cod sursa(job #710964)

Utilizator geobarosanu1Tutuianu George geobarosanu1 Data 11 martie 2012 01:48:04
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <stdlib.h>
using namespace std;
#define mod 666013
#define max 1<<20
#define DIM 10000
char buff[DIM];

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


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

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

}
int pz;

inline void citeste(unsigned &x){

	x=0;
	while((buff[pz]<'0' || buff[pz]>'9') && (buff[pz]!='-'))
		if(++pz==DIM)fread(buff, 1, DIM, stdin), pz=0;     
	
	while(buff[pz]>='0' && buff[pz]<='9'){
		
		x=x*10+buff[pz]-'0';
		if(++pz==DIM)fread(buff,1, DIM, stdin),pz=0;
	}
}
void read(){
	
	scanf("%d %d %d", &N, &L, &U);
	int norm=0;
			char c;
		scanf("%c", &c);
	for (int i=0;i<N;++i){
		unsigned int x;

		citeste(x);

		//int rez=search(x);
		int cheie=x%mod,rez=-1;
		int ok=1;
		for (int i=0;i<Hash[cheie].size() && ok;++i)
			if (Hash[cheie][i].first==x){
				rez=Hash[cheie][i].second;
				ok=0;
			}
		if (rez==-1){
			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;
	
	
	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));

}