Cod sursa(job #857837)

Utilizator tibi9876Marin Tiberiu tibi9876 Data 18 ianuarie 2013 13:12:18
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda ichb-locala-2013-10 Marime 1.07 kb
#include<fstream>
#include<algorithm>
using namespace std;

struct st
{
	unsigned int x,y;
};

st a[1100000];
int v[1100000],b[1100000],w[1100000],i,j,k,l,u,n,p,q,t;
long long s;

bool cmp1(st a,st b)
{
	return a.x<b.x;
}

bool cmp2(st a,st b)
{
	return a.y<b.y;
}



int main()
{
	ifstream f("secv5.in");
	ofstream g("secv5.out");
	f >> n >> l >> u;
	for (i=1;i<=n;i++)
	{
		f >> a[i].x;
		a[i].y=i;
	}
	sort(a+1,a+n+1,cmp1);
	for (i=1;i<=n;i++)
	{
		k++;
		for (j=i+1;j<=n;j++)
		{
			if (a[i].x!=a[j].x)
				break;
			a[j].x=k;
		}
		a[i].x=k;
		i=j-1;
	}
	//sort(a+1,a+n+1,cmp2);
	for (i=1;i<=n;i++)
		b[a[i].y]=a[i].x;
	k=0;t=0;p=1;q=1;
	for (i=1;i<=n;i++)
	{
		if (v[b[i]]==0)
		{
			v[b[i]]=1;
			k++;
		}
		else v[b[i]]++;
		while (k>u)
		{
			v[b[p]]--;
			if (v[b[p]]==0)
				k--;
			p++;
		}
		if (w[b[i]]==0)
		{
			w[b[i]]=1;
			t++;
		}
		else w[b[i]]++;
		while ((t>l) || (w[b[q]]>1))
		{
			w[b[q]]--;
			if (w[b[q]]==0)
				t--;
			q++;
		}
		if (k>=l)
			s+=q-p+1;
	}
	g << s;
	return 0;
}