Cod sursa(job #536894)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 19 februarie 2011 17:37:40
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 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, p, dif, S[Nmax], D[Nmax] ;
long long sol ;

char buffer[Nmax<<4], *P;

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 ) ;
	}
}

ui number()
{
	ui r = 0 ;
	
	while( *P < '0' || *P > '9' ) ++P;
	while( *P >= '0' && *P <= '9' )
	{
		r = r *10 + *P - '0' ;
		++P;
	}
	
	return r ;
}

int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	
	//scanf("%u %u %u",&n,&L,&U);
	
	//for( i = 1 ; i <= n ; i++ )
	//	scanf("%u",&a[i]);
	
	fread(buffer,1,15000000,stdin);
	
	P = buffer;
	
	n = number();
	L = number();
	U = number();
	
	for( i = 1 ; i <= n ; i++ )
		a[i] = number();
	
	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("%lld",sol);
	
	return 0;
}