Cod sursa(job #1047974)

Utilizator Teodor94Teodor Plop Teodor94 Data 5 decembrie 2013 01:39:37
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <tr1/unordered_map>

using namespace std;
using namespace std::tr1;

#define uint unsigned int
#define ll unsigned long long
#define MAX_C 11
#define MAX_N 1 << 20

char read_aux[MAX_C];
uint v[MAX_N];
unordered_map< uint, int > h;

uint get_int( char s[MAX_C] ) {
    int i = 0;
    uint val = 0;
    while ( s[i] >= '0' && s[i] <= '9' ) {
        val = ( uint ) val * 10 + ( s[i] - '0' );
        ++i;
    }
    return val;
}

void read( int &n, int &l, int &u ) {
    scanf( "%d%d%d\n", &n, &l, &u );
    for ( int i = 0; i < n; ++i ) {
        gets( read_aux );

        v[i] = get_int( read_aux );
    }
}

void init( int n ) {
    for ( int i = 0; i < n; ++i )
        if ( h.find( v[i] ) != h.end() )
            h.erase( v[i] );
}

ll solve( int limit, int n ) {
    if ( limit == 0 )
        return 0;

    init( n );

    ll ans = 0;
    int left = 0;

    for ( int i = 0; i < n; ++i ) {
        if ( h.find( v[i] ) == h.end() )
            while ( left <= i && ( int ) h.size() == limit ) {
                --h[v[left]];
                if ( h[v[left]] == 0 )
                    h.erase( v[left] );

                ++left;
            }

        ++h[v[i]];

        ans += ( ll ) i - left + 1;
    }

    return ans;
}

int main() {
    freopen( "secv5.in", "r", stdin );
    freopen( "secv5.out", "w", stdout );

    int n, l, u;
    read( n, l, u );

    ll ans = solve( u, n ) - solve( l - 1, n );

    printf( "%lld\n", ans );
}