Pagini recente » Cod sursa (job #1487324) | Cod sursa (job #2465103) | Cod sursa (job #2536035) | Cod sursa (job #2428676) | Cod sursa (job #2662845)
#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 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( int 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 ) {
if ( myHash[cod][i].rep == 1 )
ret = 1;
else
ret = 0;
myHash[cod][i].rep--;
} 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( "secventa5.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( "secventa5.out", "w" );
fprintf( fout, "%lld", posib( u ) - posib( l - 1 ) );
fclose( fout );
return 0;
}