Cod sursa(job #212282)

Utilizator za_wolfpalianos cristian za_wolf Data 4 octombrie 2008 23:16:40
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
#include<string.h>
#include<vector>
#include<utility>
#include<functional>
#include<algorithm>
#define Y second
#define X first
#define NMAX 1097152
using namespace std;
unsigned long in,sf,i,j,n,m,k,l,a,b,c,y[NMAX];
unsigned long z[NMAX];
char cc,ss[32];
long long s;
vector< pair<unsigned int,unsigned int> > x(NMAX);

long long kkt(unsigned long m)
{
	long long s=0;
	in=1;
	sf=1;
	z[y[1]]=1;
	k=1;
	while (in<=sf||sf<n)
	{
		while (k<=m&&sf<=n)
		{
			sf++;
			if (!z[y[sf]])
				k++;
			z[y[sf]]++;
		}
		z[y[sf]]--;
		sf--;
		k--;
		s+=sf-in+1;
		z[y[in]]--;
		if (z[y[in]]==0)
			k--;
		in++;
	}
	return s;
}
int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	scanf("%lu%lu%lu",&n,&b,&c);

	scanf("%c",&cc);
	x.resize(n+1);
	for (i=1;i<=n;++i)
	{
		gets(ss);
		m=strlen(ss)-1;
		for (j=0;j<=m;++j)
			x[i].X=x[i].X*10+ss[j]-48;
		x[i].Y=i;
	}

	sort(x.begin()+1,x.end());
    
	k=1;
	for (i=1;i<=n;++i)
	{
		y[x[i].Y]=k;
		if (x[i].X!=x[i+1].X)
			k++;
	}
	s=kkt(c);
	s-=kkt(b-1);
	printf("%lld\n",s);
	return 0;
}