Cod sursa(job #2689415)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 20 decembrie 2020 17:53:42
Problema Secventa 5 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <map>
using namespace std;
FILE *fin;
unsigned n, v[ 1 << 20 + 1 ];
map< unsigned, unsigned > a;

long long caca( unsigned limita ){
    long long rez = 0;
    unsigned i = 0, cate = 0, st = 0;
    for( ; i < n; i++ ){
        if( !a[ v[ i ] ] )
            while( st <= i && cate == limita ){
                --a[ v[ st ] ];
                if( a[ v[ st ] ] == 0 )
                    --cate;
                ++st;
            }
        if( !a[ v[ i ] ] )
            ++cate;
        ++a[ v[ i ] ];
        rez += ( long long )i - st + 1;
    }
    a.clear();
    return rez;
}

int read_int(){
    int rez = 0, ch;
    while( !isdigit( ( ch = fgetc( fin ) ) ) );

    do
        rez = rez * 10 + ch - '0';
    while( isdigit( ( ch = fgetc( fin ) ) ) );
    return rez;
}

int main()
{
    unsigned st, dr;
    fin = fopen( "secv5.in", "r" );
    n = read_int();
    st = read_int();
    dr = read_int();
    for( int i = 0; i < n; i++ )
        v[ i ] = read_int();
    fclose( fin );
    FILE *fout = fopen( "secv5.out", "w" );
    fprintf( fout, "%lld\n", caca( dr ) - caca( st - 1 ) );
    fclose( fout );
    return 0;
}