Cod sursa(job #212079)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 4 octombrie 2008 12:52:41
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
using namespace std;

#include <cstdio>
#include <vector>
#include <ctime>
#include <algorithm>

#define II inline
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX (1<<20)+2
#define L_MAX 1<<24
#define f first
#define s second
#define IN  "secv5.in"
#define OUT "secv5.out"
#define MOD  666013

char buffer[L_MAX];
unsigned int V[N_MAX];
unsigned int M[N_MAX],P[N_MAX];
int K(-1),N,L,U;
int AA[90];
vector< pair<unsigned,int> > A(N_MAX);  

II unsigned int read()
{
	unsigned int aux(0);
	for(;buffer[K] > '9' || buffer[K] < '0';++K);
	for(;buffer[K] <= '9' && buffer[K] >= '0';++K)
		aux = aux * 10 + buffer[K] - '0';
	return aux;
}

II void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	fread(buffer,1,1<<24,stdin);
	fclose(stdin);
	N = read();
	L = read();
	U = read();
	A.resize(N+1);  
    FOR(i,1,N)  
        M[i] = A[i].f = read(),  
        A[i].s = i;  
}		

II void hash()  
{  
    unsigned last,nr(1);  
       
	sort(A.begin()+1,A.end());  
    last = A[1].f;  
    FOR(i,1,N)  
    {  
        if(A[i].f != last)  
            last = A[i].f,  
        ++nr;     
        M[ A[i].s ] = nr;  
    }   
	
}

II long long solve(int  A)
{
	int X(0),x(1);
	if(P[N])
		memset(V,0,sizeof(V));
	
	FOR(i,1,N)
	{
		if(!V[ M[i] ])
			++X;
		++V[ M[i] ];
		
		for(;X <= A && i<=N;)
		{
			if( !V[ M[i+1] ] && X == A)
				break;
			P[i] = x;
			++i;

			if(! V[ M[i] ] )
				++X;
			++V[ M[i] ];
		}	
		
		for(;X > A && x<=N;)
		{
			if( !(V[ M[x] ] - 1) )
				--X;
			--V[ M[x] ];
			++x;	
		}
		P[i] = x;
	}
	
	long long rez(0);  
    FOR(i,1,N)  
        rez += (long long) (i-P[i]+1);  
    if(rez < 0)  
        rez = 0;  
    return rez; 
}

int main()
{
	scan();
	hash();
	printf("%lld\n", solve(U) - solve(L-1) );  
	return 0;
}