Cod sursa(job #85361)

Utilizator peanutzAndrei Homorodean peanutz Data 21 septembrie 2007 10:03:31
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

#define NMAX (1<<20)+5

int a[NMAX], v[NMAX];
int n, l, u;

void read()
{
	int i;
	scanf("%d%d%d", &n, &l, &u);
	for(i = 1; i <= n; ++i)
		scanf("%d", a+i);
}

long long solve(long long x)
{
	int i, j;
	long long res = 0;
	int nr = 0;
	int len[NMAX];
	int uz[NMAX];

	memset(uz, 0, sizeof(uz));

	len[0] = 1;
	for(i = 1; i <= n; ++i)
	{
		if(!uz[a[i]])
			++nr;
  	    ++uz[a[i]];
	
		if(nr > x)
			for(j = len[i-1]; j <= i; ++j)
			{
				--uz[a[j]];
				if(!uz[a[j]])
				{
                 	--nr, len[i] = j+1;
                    break;
                }
			}
        else
            len[i] = len[i-1];
		res += i-len[i]+1;
	}
//    printf("%d\n", res);
	return res;
}
		
int main()
{
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);

	read();

	sort(a+1, a+n+1);
	for(int i = 1; i <= n; ++i)
		v[i] = (a[i] != a[i-1]) ? i : (v[i-1]);//, printf("%d ", v[i]);

	printf("%lld\n", solve(u) - solve(l-1));

	return 0;
}