Cod sursa(job #673452)

Utilizator swift90Ionut Bogdanescu swift90 Data 4 februarie 2012 15:20:59
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
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;
}*/
typedef pair<unsigned int,int> PLI;
vector <PLI> H(dim);
long long solve(int D){
	long long sol=0;
	int i,ex,st;
	if(D!=U)
		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+=(long long)i-st+1;
	}
	return sol;
}
int main(){
	freopen("secv5.in","r",stdin);
	//ifstream f("secv5.in");
	freopen("secv5.out","w",stdout);
	int i;
	unsigned int x;
	scanf("%u%u%u",&N,&L,&U);
	//f>>N>>L>>U;
	for(i=1;i<=N;++i){
		scanf("%u",&x);
		//f>>x;
		H[i].first=x;
		H[i].second=i;
	}
	sort(H.begin()+1,H.begin()+N+1);
	H[0].first=H[1].first+1;
	for(i=1;i<=N;++i){
		if(H[i].first!=H[i-1].first)
			++M;
		nr[H[i].second-1]=M;
	}
	printf("%lld\n",solve(U)-solve(L-1));
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}