Cod sursa(job #671357)

Utilizator an_drey_curentandreycurent an_drey_curent Data 31 ianuarie 2012 11:09:54
Problema Secventa 5 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<stdio.h>
#include<vector>
#define prim 123457
using namespace std;
unsigned hhash[123460][50];
unsigned frecv[123460][50];
unsigned v[1100000];
#define DIM 10
char buff[DIM+16];
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;
            }
}
int existenta(unsigned citit)
{
	unsigned i=0,cheie=citit%prim;
	while(hhash[cheie][i]!=0)
	{
		if(citit==hhash[cheie][i]&&frecv[cheie][i]!=0)
		{
			frecv[cheie][i]++;
			return 1;
		}
		i++;
	}
	hhash[cheie][0]=citit;
	frecv[cheie][0]=1;
	return 0;
}
int stergere(unsigned citit)
{
	unsigned i=0,cheie=citit%prim;
	while(hhash[cheie][i]!=0)
	{
		if(citit==hhash[cheie][i]&&frecv[cheie][i]!=0)
		{
			frecv[cheie][i]--;
			if(frecv[cheie][i]==0)
			return 0;
			else
				return 1;
		}
		i++;
	}
}
int main()
{
	unsigned j,i,N,L,U,indice_inceput=0,indice_sfarsit=0;
	unsigned contor_distincte=0;
	unsigned contor_U=0;
	unsigned contor_L=0;
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	scanf("%u%u%u",&N,&L,&U);
	for(i=0;i<N;i++)
	{
		citeste(v[i]);
		indice_sfarsit=i;
		if(!(existenta(v[i])))
		    contor_distincte++;
		while(contor_distincte>U)
		{
			if(!(stergere(v[indice_inceput])))
					contor_distincte--;
			indice_inceput++;
		}
		contor_U+=(indice_sfarsit-indice_inceput+1);
	}
	for(i=0;i<123458;i++)
	{
		for(j=0;j<10;j++)
		{
			hhash[i][j]=0;frecv[i][j]=0;
		}
	}
	indice_inceput=0;
	contor_distincte=0;
	L--;
	for(i=0;i<N;i++)
	{
		indice_sfarsit=i;
		if(!(existenta(v[i])))
			contor_distincte++;
		while(contor_distincte>L)
		{
			if(!(stergere(v[indice_inceput])))
				contor_distincte--;
			indice_inceput++;
		}
		contor_L+=(indice_sfarsit-indice_inceput+1);
	}
	printf("%u",contor_U-contor_L);
	return 0;
}