Cod sursa(job #536891)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 19 februarie 2011 17:30:34
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
#include<vector>
#define Mod 666013
#define Nmax 1050000
#define ui unsigned int 
using namespace std;

ui a[Nmax], i, n, U, L, sol, p, dif, S[Nmax], D[Nmax] ;

struct element { ui x, ap ; } ;

vector<element> V[Mod] ;

int find ( ui x ) 
{
	int r = x % Mod ; 
	
	int N = V[r].size() , i ;
	
	for( i = 0 ; i < N ; i++ )
		if( V[r][i].x == x ) return i ;
	
	return N ; 
}

void push ( ui x ) 
{
	int r = x % Mod ; 
	
	int N = V[r].size() ; 
	int i = find(x) ;
	
	if( i == N ) 
	{
		element e ;
		e.x = x ; e.ap = 1 ;
		V[r].push_back(e);
		dif++;
	}
	else 
		V[r][i].ap++;
}

void pop ( ui x ) 
{
	int r = x % Mod ;
	
	int i = find(x); 
	
	V[r][i].ap--;
	if( !V[r][i].ap )
	{
		dif--;
		V[r].erase(V[r].begin() + i ) ;
	}
}

int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	
	scanf("%lu %lu %lu",&n,&L,&U);
	
	for( i = 1 ; i <= n ; i++ )
		scanf("%lu",&a[i]);
	
	p = 1 ;
	for( i = 1 ; i <= n ; i++ )
	{
		push(a[i]);
		
		while( dif >= L ) 
		{
			S[p] = i ;
			pop(a[p]);
			p++;
		}
	}
	
	for( i = p ; i <= n ; i++ )
		pop(a[i]);
	
	p = 1 ; dif = 0 ;
	for( i = 1 ; i <= n ; i++ )
	{
		push(a[i]);
		
		while( dif > U ) 
		{
			D[p] = i - 1  ;
			pop(a[p]);
			p++;
		}
	}
	
	for( i = p ; i <= n ; i++ )
		if( S[i] ) D[i] = n ;
		
	
	for( i = 1 ; i <= n && S[i] ; i++ )
		sol += D[i] - S[i] + 1 ;
	
	printf("%lu",sol);
	
	return 0;
}