Cod sursa(job #538321)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 21 februarie 2011 07:44:44
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<stdio.h>
#include<list>
#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 ; } ;

list<element> V[Mod] ;

list<element> :: iterator  find ( ui x, int r ) 
{
	list<element> :: iterator it ;
	
	for( it = V[r].begin(); it != V[r].end() ; it++ )
		if( it->x == x ) return it ;
	
	return V[r].end() ; 
}

void push ( ui x ) 
{
	int r = x % Mod ; 
	
	list<element> :: iterator it = find(x,r);
	
	if( it == V[r].end() ) 
	{
		element e ;
		e.x = x ; e.ap = 1 ;
		V[r].push_back(e);
		dif++;
	}
	else 
		it->ap++;
}

void pop ( ui x ) 
{
	int r = x % Mod ;
	
	list<element> :: iterator it = find(x,r);
	
	it->ap-- ;
	if( !it->ap ) 
	{
		dif--;
		V[r].erase(it) ;
	}
}

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