Cod sursa(job #2662832)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 24 octombrie 2020 16:30:24
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <vector>
#define NMAX (1<<20)
#define MOD 666013
using namespace std;
int v[NMAX], n;
struct elem {
    int a, rep;
};
vector<elem> myHash[MOD];
void resetHash() {
    int i;
    for ( i = 0; i < MOD; i++ )
        myHash[i].clear();
}
bool adauga( int x ) {
    int cod, ret, i;
    cod = x % MOD;
    i = 0;
    while ( i < myHash[cod].size() && myHash[cod][i].a != x )
        i++;
    if ( i == myHash[cod].size() ) {
        myHash[cod].push_back( { x, 1 } );
        ret = 1;
    } else {
        myHash[cod][i].rep++;
        ret = 0;
    }
    return ret;
}
bool sterge( int x ) {
    int cod, ret, i;
    cod = x % MOD;
    i = 0;
    while ( i < myHash[cod].size() && myHash[cod][i].a != x )
        i++;
    if ( i < myHash[cod].size() ) {
        if ( myHash[cod][i].rep == 1 )
            ret = 1;
        else
            ret = 0;
        myHash[cod][i].rep--;
    }
    else
        ret = 0;
    return ret;
}
int posib( int k ) {
    int sol, dist, i, j;
    resetHash();
    j = dist = sol = 0;
    for ( i = 0; i < n; i++ ) {
        dist += adauga( v[i] );
        if ( dist > k ) {
            while ( j <= i && dist > k ) {
                dist -= sterge( v[j] );
                j++;
            }
        }
        sol += i - j + 1;
    }
    return sol;
}
int main() {
    FILE *fin, *fout;
    int l, u, i;
    fin = fopen( "secv5.in", "r" );
    fscanf( fin, "%d%d%d", &n, &l, &u );
    for ( i = 0; i < n; i++ )
        fscanf( fin, "%d", &v[i] );
    fclose( fin );
    fout = fopen( "secv5.out", "w" );
    fprintf( fout, "%d", posib( u ) - posib( l - 1 ) );
    fclose( fout );
    return 0;
}