Cod sursa(job #1047969)

Utilizator Teodor94Teodor Plop Teodor94 Data 5 decembrie 2013 01:35:04
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

ifstream fin( "secv5.in" );
ofstream fout( "secv5.out" );

pair < uint, int > v[MAX_N];
pair < int, int > a[MAX_N];
int freq[MAX_N];

bool cmp( pair< int, int > x, pair< int, int > y ) {
    return x.second < y.second;
}

void read( int &n, int &l, int &u ) {
    fin >> n >> l >> u;
    for ( int i = 0; i < n; ++i ) {
        fin >> v[i].first;
        v[i].second = i;
    }
}

void simplify( int n ) {
    sort( v, v + n );

    a[0].first = 1;
    a[0].second = v[0].second;
    for ( int i = 1; i < n; ++i ) {
        a[i].first = a[i - 1].first;
        a[i].second = v[i].second;
        if ( v[i].first != v[i - 1].first )
            ++a[i].first;
    }

    sort( a, a + n, cmp );
}

void init( int n ) {
    for ( int i = 0; i <= n; ++i )
        freq[i] = 0;
}

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

    init( n );

    ll ans = 0;
    int left = 0, distinct_numbers = 0;

    for ( int i = 0; i < n; ++i ) {
        if ( !freq[a[i].first] )
            while ( left <= i && distinct_numbers == limit ) {
                --freq[a[left].first];
                if ( freq[a[left].first] == 0 )
                    --distinct_numbers;

                ++left;
            }

        if ( !freq[a[i].first] )
            ++distinct_numbers;
        ++freq[a[i].first];

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

    return ans;
}

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

    simplify( n );

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

    fout << ans;
}