Cod sursa(job #857798)

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

struct st
{
	unsigned int x,y;
};

st a[1100000];
int v[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);
	k=0;t=0;p=1;q=1;
	for (i=1;i<=n;i++)
	{
		if (v[a[i].x]==0)
		{
			v[a[i].x]=1;
			k++;
		}
		else v[a[i].x]++;
		while (k>u)
		{
			v[a[p].x]--;
			if (v[a[p].x]==0)
				k--;
			p++;
		}
		if (w[a[i].x]==0)
		{
			w[a[i].x]=1;
			t++;
		}
		else w[a[i].x]++;
		while ((t>l) || (w[a[t].x]>1))
		{
			w[a[q].x]--;
			if (w[a[q].x]==0)
				t--;
			q++;
		}
		if (k>=l)
			s+=q-p+1;
	}
	g << s;
	return 0;
}