Cod sursa(job #336893)

Utilizator rumburakrumburak rumburak Data 1 august 2009 19:43:43
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

const unsigned int m = 699967;
const unsigned int N = (1<<20);

vector<pair<unsigned int,unsigned int> > x;
unsigned int n,v[N],poz[N];
unsigned int apa[N],apb[N];
int a,b;

void citire()
{
	char s[11],*p;
	scanf("%u%u%u\n",&n,&a,&b);
	for(unsigned int i=0;i<n;++i)
	{
		//scanf("%s\n",s);
		//fgets(s,11,stdin);
		gets(s);
		for(p=s,v[i]=0;*p && *p!='\n';++p)
			v[i]=v[i]*10+*p-'0';
		x.push_back(make_pair(v[i],i));
	}
}

void calcul()
{
	
	long long rez=0;
	unsigned int i;
	sort(x.begin(),x.end());
	poz[0]=0;
	for(i=1;i<n;++i)
		if(x[i].first==x[i-1].first)
			poz[i]=poz[i-1];
		else
			poz[i]=1+poz[i-1];
	for(i=0;i<n;++i)
		v[x[i].second]=poz[i];
	int nra=0,nrb=0,pa=-1,pb=-1;
	for(i=0;i<n;++i)
	{
		if(!apa[v[i]])
			++nra;
		if(!apb[v[i]])
			++nrb;
		++apa[v[i]];
		++apb[v[i]];
		while(nra==a)
		{
			++pa;
			--apa[v[pa]];
			if(!apa[v[pa]])
				--nra;
		}
		while(nrb==b+1)
		{
			++pb;
			--apb[v[pb]];
			if(!apb[v[pb]])
				--nrb;
		}
		rez+=pa-pb;
	}
	printf("%lld\n",rez);
}

int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	citire();
	calcul();
	return 0;
}