Cod sursa(job #381384)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 10 ianuarie 2010 14:37:17
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<string.h>
#define	f first
#define s second
#include<vector>
using namespace std;
#define prim 666013
#define nmax 1<<20

int n,lin,nr=-1,v[1<<nmax],f[1<<nmax];
unsigned int val;
vector< pair<unsigned int,int> > h[prim+2];

int cautare()
{
	lin=val%prim;
	int i,lim=h[lin].size();
	for(i=0;i<lim;i++)
		if(val==h[lin][i].f)
			return i;
	return -1;
}

int insert()
{
	int poz=cautare();
	if(poz==-1)
	{
		h[lin].push_back(make_pair(val,++nr));
		return nr;
	}
	return h[lin][poz].s;
}

long long calc(int x)
{
	if(x==0)
		return 0;
	int i,poz,nr=1;
	long long sol=0;
	poz=0;
	f[v[0]]=1;
	for(i=1;i<n;i++)
	{
		f[v[i]]++;
		if(f[v[i]]==1)
			nr++;
		while(nr>x)
		{
			f[v[poz]]--;
			if(f[v[poz]]==0)
				nr--;
			poz++;
		}
		sol=sol+i-poz+1;
	}
	return sol;
}

int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	int p,u;
	scanf("%d%d%d",&n,&p,&u);
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%u",&v[i]);
		val=v[i];
		v[i]=insert();
	}
	long long sol=calc(u);
	memset(f,0,sizeof(f));
	sol=sol-calc(p-1);
	printf("%lld\n",sol);
	return 0;
}