Cod sursa(job #811047)

Utilizator matei_cChristescu Matei matei_c Data 11 noiembrie 2012 14:02:29
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

#define maxn 1048576
#define mod 10001

int n ;
int L, U ;
vector < pair<unsigned int, int> > hash[mod] ;
int indice ;
unsigned int ind[maxn] ;
int cate[maxn] ;
char sir[64] ;

int gasit(unsigned int x)
{
	
    int r = x % mod ;
	int len = hash[r].size() ;
	
    for( int i = 0; i < len; ++i )
        if( hash[r][i].first == x )
            return hash[r][i].second ;
		
    return -1 ;	
	
}

void adauga(unsigned int x, int poz)
{

	int ok = gasit( x ) ;
    
	if( ok == -1 )
    {
		int r = x % mod ;
        hash[r].push_back( make_pair( x, indice )) ;
        ind[poz] = indice ;
        ++indice ;
    }
    
	else
        ind[poz] = ok ;	
	
}

long long numar(int nrmax)
{
	
    int nrdif = 0 ;
    int st = -1 ;
    long long sol = 0 ;
	
    for(int i = 0; i < n; ++i )
    {
		
        if( ! cate[ ind[i] ] )
            ++nrdif ;
		
        ++cate[ ind[i] ] ;
		
        while( st < i && nrdif > nrmax )
        {
            ++st ;
            --cate[ ind[st] ] ;
            if( ! cate[ ind[st] ] )
                --nrdif ;                
        }
		
        sol += i - st ;
    
	}
	
    return sol;
	
}	
	
int main()
{
	
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);
	
	scanf("%d%d%d",&n, &L, &U);
	
	for(int i = 0; i < n; ++i )
	{	
		
		scanf("%s", sir);
		
		unsigned int x = 0 ;
		for(int j = 0 ; sir[j] >= '0' && sir[j] <= '9'; ++j )
			x = x * 10 + ( sir[j] - '0' ) ;
		adauga( x, i ) ;
		
	}	
	
	long long sol1 = numar(U) ;
	
	memset( cate, 0, sizeof(cate) ) ;
	
	long long sol2 = numar(L-1) ;
	
	long long sol = sol1 - sol2 ;
	
	printf("%lld\n", sol);
	
	return 0;
	
}