Cod sursa(job #12932)

Utilizator MariusMarius Stroe Marius Data 5 februarie 2007 12:19:18
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <memory>
using namespace std;

const char iname[] = "secv5.in";
const char oname[] = "secv5.out";

#define MAX_N   1048576
#define MAX_BUF 11000000
#define MAX_V   65536

typedef unsigned int u32;

int N, L, U;

u32 X[MAX_N];

u32 A[MAX_N], B[MAX_N];

int P[MAX_N];

int cnt[MAX_V], cntL[MAX_N], cntU[MAX_N], _index[MAX_N];

char buffer[MAX_BUF];

void read_in(void)
{
	freopen(iname, "r", stdin);
	int i;
	scanf("%d %d %d\n", &N, &L, &U);
	for (i = 0; i < N; ++i)
		scanf("%u", X + i);
}

void sort(u32 A[], u32 B[], const int k)
{
	int i;
	memset(cnt, 0, sizeof(cnt));
	for (i = 0; i < N; ++i) {
		_index[i] = ((X[ A[i] ] >> (k * 16)) & 65535);
		cnt[_index[i]] ++;
	}
	for (i = 1; i < MAX_V; ++i)
		cnt[i] += cnt[i - 1];
	for (i = N; i--; )
		B[-- cnt[_index[i]]] = A[i];
}

int main(void) 
{
	read_in();
	int i;
	int k;
	int FL, numL = 0;
	int FU, numU = 0;
	long long Res = 0;
	for (i = 0; i < N; ++i)
		A[i] = i;
	sort(A, B, 0);
	sort(B, A, 1);
	for (i = 0; i < N; ++i) {
		if ((i > 0) && (X[ A[i] ] == X[ A[i - 1] ]))
			P[ A[i] ] = P[ A[i - 1] ];
		else
			P[ A[i] ] = A[i] ;
	}
	for (i = FU = FL = 0; i < N; ++i) {
		k = P[i];
		numL += ((++ cntL[k]) == 1);
		numU += ((++ cntU[k]) == 1);
		for (; numU > U; ++FU) {
			k = P[FU];
			numU -= ((-- cntU[k]) == 0);
		}
		for (; numL >= L; ++FL) {
			k = P[FL];
			if ((cntL[k] == 1) && (numL == L))
				break ;
			numL -= ((-- cntL[k]) == 0);
		}
		if (L == numL)
			Res += (long long)(FL - FU + 1);
	}
	freopen(oname, "w", stdout);
	printf("%lld\n", Res);
	return 0;
}