Cod sursa(job #2689424)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 20 decembrie 2020 18:28:42
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <algorithm>
#include <stdio.h>
#define MAX 1 << 20 + 1
using namespace std;
pair< unsigned, int > v[ MAX ];
unsigned a[ MAX ], f[ MAX ];
int n, st, dr;
FILE *fin;

long long caca( int limita ){
    long long rez = 0;
    unsigned pipi = 0, cate = 0;
    for( int i = 0; i < n; i++ ){
        if( !f[ a[ i ] ] )
            while( pipi <= i && cate == limita ){
                if( --f[ a[ pipi ] ] == 0 )
                    --cate;
                ++pipi;
            }
        if( ++f[ a[ i ] ] == 1 )
            ++cate;
        rez += ( long long )i - pipi + 1;
    }
    for( int i = 0; i < n; i++ )
        f[ i ] = 0;
    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()
{
    fin = fopen( "secv5.in", "r" );
    n = read_int();
    st = read_int();
    dr = read_int();
    for( int i = 0; i < n; i++ ){
        v[ i ].first = read_int();
        v[ i ].second = i;
    }
    fclose( fin );
    sort( v, v + n );
    int el = 0;
    a[ v[ 0 ].second ] = el;
    for( int i = 1; i < n; i++ )
        if( v[ i - 1 ].first == v[ i ].first )
            a[ v[ i ].second ] = el;
        else a[ v[ i ].second ] = ++el;
    FILE *fout = fopen( "secv5.out", "w" );
    fprintf( fout, "%lld", caca( dr ) - caca( st - 1 ) );
    fclose( fout );
    return 0;
}