Pagini recente » Cod sursa (job #2372942) | Cod sursa (job #3315455) | Cod sursa (job #1483327) | Cod sursa (job #3237550) | Cod sursa (job #2663019)
#include <stdio.h>
#include <vector>
#define NMAX (1<<20)
#define MOD 666013
using namespace std;
unsigned v[NMAX];
int n;
struct elem {
unsigned a;
int rep;
};
vector<elem> myHash[MOD];
void resetHash() {
int i;
for ( i = 0; i < MOD; i++ )
myHash[i].clear();
}
bool adauga( unsigned x ) {
int n, cod, ret, i;
cod = x % MOD;
n = myHash[cod].size();
i = 0;
while ( i < n && myHash[cod][i].a != x )
i++;
if ( i == n ) {
myHash[cod].push_back( { x, 1 } );
ret = 1;
} else {
myHash[cod][i].rep++;
ret = 0;
}
return ret;
}
bool sterge( unsigned x ) {
int cod, ret, i;
cod = x % MOD;
i = 0;
while ( myHash[cod][i].a != x )
i++;
myHash[cod][i].rep--;
if ( myHash[cod][i].rep == 0 ) {
myHash[cod].erase( myHash[cod].begin() + i );
ret = 1;
} else
ret = 0;
return ret;
}
long long posib( int k ) {
int dist, i, j;
long long sol;
resetHash();
j = dist = sol = 0;
for ( i = 0; i < n; i++ ) {
dist += adauga( v[i] );
while ( j <= i && dist > k ) {
dist -= sterge( v[j] );
j++;
}
if ( dist <= k )
sol += i - j + 1;
}
if ( k == 0 )
sol = 0;
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, "%u", &v[i] );
fclose( fin );
fout = fopen( "secv5.out", "w" );
fprintf( fout, "%lld", posib( u ) - posib( l - 1 ) );
fclose( fout );
return 0;
}