Cod sursa(job #9629)

Utilizator wefgefAndrei Grigorean wefgef Data 27 ianuarie 2007 16:28:14
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 1.04 kb
#include <cstdio>
#include <map>

using namespace std;

#define Nmax (1 << 20)

map<int, int> H, M;
long long rez;
int n, a, b, cnt, cnt2;
int v[Nmax];

void readdata()
{
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);
	
	scanf("%d %d %d", &n, &a, &b);
	for (int i = 0; i < n; ++i)
		scanf("%d", &v[i]);
}

int main()
{
	int i, j, k;
	long long aux;
	
	readdata();
	
	j = 0;
	k = 0;
	for (i = 0; i < n; ++i)
	{
		if (H.find(v[i]) == H.end())
		{
			H[v[i]] = 1;
			++cnt;
		}
		else  ++H[v[i]];

		if (M.find(v[i]) == M.end())
		{
			M[v[i]] = 1;
			++cnt2;
		}
		else  ++M[v[i]];
		
		while (cnt > b)
		{
			--H[v[j]];
			if (H[v[j]] == 0)
			{
				H.erase( H.find(v[j]) ); 
				--cnt;
			}
			++j;
		}
		
		while (cnt2 > a || (cnt2 == a && M[v[k]] > 1))
		{
			--M[v[k]];
			if (M[v[k]] == 0)
			{
				M.erase( M.find(v[k]) );
				--cnt2;
			}
			++k;
		}		
		if (cnt >= a)
		{
			aux = k-j+1;
			if (aux)
			rez += aux;
		}
	}
	
	printf("%lld\n", rez);
	return 0;
}