Cod sursa(job #210986)

Utilizator stinkyStinky si Grasa stinky Data 30 septembrie 2008 00:15:21
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<cstdio>
#include<list>

using namespace std;

const int M=696643;
const int N=(1<<20)+5;
const int L=10;

unsigned int h1[M][L],h2[M][L];
unsigned int v[N],n,st,dr,nr[N],nd,w[N];

bool exista(unsigned int x){
	unsigned int r=x%M;
	for(unsigned int i=1;i<=h1[r][0];++i)
		if(h1[r][i]==x)
			return true;
	return false;
}

unsigned int pozitie(unsigned int x){
	unsigned int r=x%M;
	//list<unsigned int>::iterator it1,it2;
	for(unsigned int i=1 ; i<=h1[r][0] ; ++i)
		if(h1[r][i]==x)
			return h2[r][i];
	return 0;
}

void citire(){
	char sir[16],*p;
	scanf("%d%d%d\n",&n,&st,&dr);
	for(unsigned int i=0;i<n;++i){
		//scanf("%u",&v[i]);
		fgets(sir,16,stdin);
		for(p=sir,v[i]=0;*p!='\n';++p)
			v[i]=v[i]*10+(*p-'0');
		if(!exista(v[i])){
			h1[v[i]%M][++h1[v[i]%M][0]]=v[i];
			h2[v[i]%M][++h2[v[i]%M][0]]=nd++;
		}
	}
}
/*
unsigned int val(unsigned int i){
	list<unsigned int>::iterator it1,it2;
	for(unsigned int j=0;j<M;++j)
		for(it1=h1[j].begin(),it2=h2[j].begin() ; it1!=h1[j].end() ; ++it1,++it2)
			if(*it2==i)
				return *it1;
	return 0;
}

void proba(){
	for(int i=0;i<n;++i)
		printf("%d apare pe pozitia %d\n",v[i],w[i]);
}
*/

long long calcul(unsigned int dr){
	unsigned int i,j,nrs=1,p;
	long long rez=0;
	++nr[w[0]];
	for(i=1,j=0;i<n;++i)
	{
		p=w[i];
		++nr[p];
		if(nr[p]==1)
			++nrs;
		if(nrs==1+dr){
			while(nr[w[j]]>1)
				--nr[w[j++]];
			--nr[w[j++]];
			--nrs;
		}
		rez+=(long long)i-j+1;
	}
	return rez;
}

void calcul_w(){
	for(unsigned int i=0;i<n;++i)
		w[i]=pozitie(v[i]);
}

int main(){
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	citire();
	//printf("%d\n",numarul(196613));
	calcul_w();
	//proba();
	long long x=calcul(dr);
	memset(nr,0,N*sizeof(int));
	printf("%lld\n",x-calcul(st-1));
	return 0;
}