Cod sursa(job #673429)

Utilizator swift90Ionut Bogdanescu swift90 Data 4 februarie 2012 15:03:45
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<cstdio>
const int MOD=678133;
const int dim=(1<<20)+10;
struct Nod{
	int val;
	long long x;
	Nod *urm;
}*H[MOD];
int N,L,U,M;
int nr[dim],apar[dim];
int add(long long x){
	int rr=x%MOD;
	Nod *ax;
	ax=H[rr];
	while(ax){
		if(ax->x==x)
			return ax->val;
		ax=ax->urm;
	}
	ax=new Nod;
	ax->x=x;
	ax->val=++M;
	ax->urm=H[rr];
	H[rr]=ax;
	return ax->val;
}
long long solve(int D){
	long long sol=0;
	int i,ex,st;
	for(i=0;i<=M;++i)
		apar[i]=0;
	for(i=0,ex=0,st=0;i<N;++i){
		if(apar[nr[i]])
			++apar[nr[i]];
		else{
			++apar[nr[i]];
			++ex;
		}
		while(ex>D){
			--apar[nr[st]];
			if(apar[nr[st]]==0)
				--ex;
			++st;
		}
		sol+=i-st+1;
	}
	return sol;
}
int main(){
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	int i;
	long long x;
	scanf("%d%d%d",&N,&L,&U);
	for(i=0;i<N;++i){
		scanf("%lld",&x);
		nr[i]=add(x);
	}
	printf("%lld\n",solve(U)-solve(L-1));
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}