Cod sursa(job #2349666)

Utilizator robx12lnLinca Robert robx12ln Data 20 februarie 2019 17:09:25
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;

FILE * fin = fopen("secv5.in", "r");
FILE * fout = fopen("secv5.out", "w");

const int DIM = (1<<20) + 5;

int N, V[DIM], f[DIM], st, dr, mid, L, U, Norm[DIM], K, Nr;
long long Ans;

int main(){

    fscanf( fin, "%d%d%d", &N, &L, &U );
    for( int i = 1; i <= N; i++ ){
        fscanf( fin, "%d", &V[i] );
        Norm[i] = V[i];
    }

    sort( Norm + 1, Norm + N + 1 );
    for( int i = 1; i <= N; i++ )
        if( Norm[i] != Norm[K] )
            Norm[++K] = Norm[i];

    for( int i = 1; i <= N; i++ ){
        st = 1; dr = K;
        while( st <= dr ){
            mid = ( st + dr ) >> 1;
            if( Norm[mid] < V[i] )
                st = mid + 1;
            else
                dr = mid - 1;
        }
        V[i] = st;
    }

    st = 1;
    for( int i = 1; i <= N; i++ ){
        Nr += ( f[ V[i] ] == 0 );
        f[ V[i] ]++;
        while( Nr > U ){
            f[ V[st] ]--;
            Nr -= ( f[ V[st] ] == 0 );
            st++;
        }
        Ans += i - st + 1;
    }

    st = 1; Nr = 0; L--;
    memset( f, 0, sizeof(f) );
    for( int i = 1; i <= N; i++ ){
        Nr += ( f[ V[i] ] == 0 );
        f[ V[i] ]++;
        while( Nr > L ){
            f[ V[st] ]--;
            Nr -= ( f[ V[st] ] == 0 );
            st++;
        }
        Ans -= (i - st + 1);
    }
    fprintf( fout, "%lld\n", Ans );
    return 0;
}