Cod sursa(job #9558)

Utilizator testTest User test Data 27 ianuarie 2007 16:10:45
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 0.72 kb
#include <cstdio>
#include <map>

using namespace std;

const int MAXN = (1 << 20) + 5;

int N, L, U, x[MAXN];
map<int, int> M;

long long getnumber(int K)
{
	if (K == 0)
		return 0;
	int l, r; long long nr = 0;
	M.clear();
	for (l = r = 0; r < N; r++)
	{
		if (M.find( x[r] ) == M.end())
			M[ x[r] ] = 1;
		else
			M[ x[r] ] = M[ x[r] ] + 1;
		for (; (int)M.size() > K; l++)
		{
			M[ x[l] ] = M[ x[l] ] - 1;
			if (M[ x[l] ] == 0)
				M.erase( M.find( x[l] ) );
		}
		nr += r - l + 1;
	}
	return nr;
}

int main()
{
	freopen("secv5.in", "rt", stdin);
	freopen("secv5.out", "wt", stdout);
	scanf("%d %d %d", &N, &L, &U);
	for (int i = 0; i < N; i++)
		scanf("%d", x + i);
	printf("%lld\n", getnumber(U) - getnumber(L - 1));
	return 0;
}