Cod sursa(job #10032)

Utilizator testTest User test Data 27 ianuarie 2007 20:25:35
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

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

int N, L, U;
unsigned x[MAXN];
vector< pair<unsigned, int> > y;
short used[MAXN];

long long getnumber(int K)
{
	if (K == 0)
		return 0;
	int l, r, nrused = 0; long long nr = 0;
	memset(used, 0, sizeof(used));
	for (l = r = 0; r < N; r++)
	{
		if (!used[ x[r] ])
			nrused++;
		used[ x[r] ]++;
		for (; nrused > K; l++)
		{
			used[ x[l] ]--;
			if (!used[ x[l] ])
				nrused--;
		}
		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("%u", x + i);
		y.push_back( make_pair(x[i], i) );
	}

	sort(y.begin(), y.end());
	for (int i = 0, j = 0; i < N; i++)
	{
		if (i > 0 && y[i].first != y[i - 1].first)
			j++;
		x[ y[i].second ] = j;
	}

	printf("%lld\n", getnumber(U) - getnumber(L - 1));
	return 0;
}