Cod sursa(job #425426)

Utilizator otilia_sOtilia Stretcu otilia_s Data 25 martie 2010 18:48:39
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 1048578
#define MOD 666013 
unsigned int v[NMAX],nra[NMAX],n;
vector < pair<unsigned int,unsigned int> > H[MOD];

unsigned int findval(unsigned int val)
{
   unsigned int L = val % MOD, i;
   for (i=0; i<H[L].size(); ++i)
    if (H[L][i].first==val) return H[L][i].second;   
   return 0;
}

unsigned int SecDist(unsigned int X)
{
	unsigned int i,Li,nrsec,nrd;
	memset(nra,0,sizeof(nra));//nr aparitii
	Li=1; nrd=0; nrsec=0;
	for (i=1;i<=n; ++i)
	{		
	 nra[v[i]]++;
	 if (nra[v[i]]==1) ++nrd;
	 while (nrd>X)
	 {
		if (nra[v[Li]]--);
		if (!nra[v[Li]]) --nrd;
		++Li;		
	 }	 
	 nrsec+=i-Li+1;
	}	
  return nrsec;
}

int main()
{
	freopen("secv5.in","r",stdin);
	unsigned int L,U;
	scanf("%u %u %u",&n,&L,&U);
	
	unsigned nd=0,i; 
	int val;
	for (i=1;i<=n;++i)
	{
		scanf("%u",&val);
		v[i]=findval(val);
		if( !v[i])
			{
				++nd;
				H[val%MOD].push_back( make_pair(val,nd));				
				v[i]=nd;
			}
	}		
	
	freopen("secv5.out","w",stdout);
	unsigned int sU=SecDist(U);
	unsigned int sL=SecDist(L-1);
	printf("%u\n",sU-sL);
	return 0;
}