Pagini recente » Cod sursa (job #2510832) | Cod sursa (job #1018562) | Cod sursa (job #2479398) | Cod sursa (job #1423469) | Cod sursa (job #2662832)
#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;
}