Cod sursa(job #10034)

Utilizator wefgefAndrei Grigorean wefgef Data 27 ianuarie 2007 20:30:22
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <cstdio>
#include <string.h>
#include <algorithm>

using namespace std;

#define Nmax (1 << 20)

unsigned int v[Nmax], u[Nmax];
int frec[Nmax];
int n, m, a, b;

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("%u", &v[i]);
}

int cauta(unsigned int x)
{
	int rez = 0;
	
	if (rez + (1 << 19) <= m && u[rez + (1 << 19)] <= x) rez += 1 << 19;
	if (rez + (1 << 18) <= m && u[rez + (1 << 18)] <= x) rez += 1 << 18;
	if (rez + (1 << 17) <= m && u[rez + (1 << 17)] <= x) rez += 1 << 17;		
	if (rez + (1 << 16) <= m && u[rez + (1 << 16)] <= x) rez += 1 << 16;		
	if (rez + (1 << 15) <= m && u[rez + (1 << 15)] <= x) rez += 1 << 15;
	if (rez + (1 << 14) <= m && u[rez + (1 << 14)] <= x) rez += 1 << 14;
	if (rez + (1 << 13) <= m && u[rez + (1 << 13)] <= x) rez += 1 << 13;
	if (rez + (1 << 12) <= m && u[rez + (1 << 12)] <= x) rez += 1 << 12;
	if (rez + (1 << 11) <= m && u[rez + (1 << 11)] <= x) rez += 1 << 11;
	if (rez + (1 << 10) <= m && u[rez + (1 << 10)] <= x) rez += 1 << 10;
	if (rez + (1 << 9) <= m && u[rez + (1 << 9)] <= x) rez += 1 << 9;
	if (rez + (1 << 8) <= m && u[rez + (1 << 8)] <= x) rez += 1 << 8;
	if (rez + (1 << 7) <= m && u[rez + (1 << 7)] <= x) rez += 1 << 7;
	if (rez + (1 << 6) <= m && u[rez + (1 << 6)] <= x) rez += 1 << 6;
	if (rez + (1 << 5) <= m && u[rez + (1 << 5)] <= x) rez += 1 << 5;
	if (rez + (1 << 4) <= m && u[rez + (1 << 4)] <= x) rez += 1 << 4;
	if (rez + (1 << 3) <= m && u[rez + (1 << 3)] <= x) rez += 1 << 3;
	if (rez + (1 << 2) <= m && u[rez + (1 << 2)] <= x) rez += 1 << 2;
	if (rez + (1 << 1) <= m && u[rez + (1 << 1)] <= x) rez += 1 << 1;
	if (rez + (1) <= m && u[rez + (1) ] <= x) rez += 1;

	return rez;
}

long long eval(int k)
{
	int i, j = 0, cnt = 0;
	long long rez = 0;
	
	memset(frec, 0, sizeof(frec));
	for (i = 0; i < n; ++i)
	{
		if (frec[v[i]] == 0)
		{
			frec[v[i]] = 1;
			++cnt;
		}
		else ++frec[v[i]];
		
		while (cnt > k)
		{
			--frec[v[j]];
			if (frec[v[j]] == 0) --cnt;
			++j;
		}
		rez += (long long)(i-j+1);
	}
	return rez;
}

void solve()
{
	int i;
	
	for (i = 0; i < n; ++i)
		u[i] = v[i];
	sort(u, u+n);
	for (i = 1; i < n; ++i)
		if (u[i] > u[i-1]) u[++m] = u[i];
		
	for (i = 0; i < n; ++i)
		v[i] = cauta(v[i]);

	printf("%lld\n", eval(b) - eval(a-1));
}

int main()
{
	readdata();
	solve();
	return 0;
}