Cod sursa(job #210829)

Utilizator 0000go gcc 0000 Data 29 septembrie 2008 18:16:43
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 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 void add(int A[], int b)
{
	int B[90]={0};
	for(;b>0;B[++B[0]] = b%10 , b/= 10);
	
    int i, t = 0;
    for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
        A[i] = (t += A[i] + B[i]) % 10;
    A[0] = i - 1;
}

II void sub(int A[], int b)
{
	int B[90]={0};
	for(;b>0;B[++B[0]] = b%10 , b/= 10);
	
    int i, t = 0;
    for (i = 1; i <= A[0]; i++)
        A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;
    for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

II int maxx(int y,unsigned int xx)
{
	int x = (int) xx;
	return max(x,y);
}

II long long solve(int  A)
{
	int X(0),x(1);
	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;
	}
	
//	if(kk == 1)
//		FOR(i,1,N)
//			add(AA, maxx(0,i-P[i]+1) );
//	else
//		FOR(i,1,N)
//			sub(AA, maxx(0,i-P[i]+1) );
	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();
	
	//solve(U,1);
	//solve(L-1,2);
	
	//for(int i=AA[0];i>=1;--i)
	//	printf("%d",AA[i]);	
	printf("%lld\n", solve(U) - solve(L-1) );  
	
	//printf("\nYour Program runs for %d ms",clock() );
	
	return 0;
}