Pagini recente » Cod sursa (job #1885521) | Cod sursa (job #2476385) | Cod sursa (job #3289731) | Cod sursa (job #2866499) | Cod sursa (job #2657536)
#include <stdio.h>
#include <vector>
using namespace std;
const int NMAX = (1 << 20);
const int MOD = 666013;
unsigned int v[NMAX + 1];
vector < pair<unsigned int, unsigned int> > myhash[MOD];
unsigned int k;
void add_hash( unsigned int x ){
unsigned int i = 0, code = x % MOD;
while( i < myhash[code].size() && x != myhash[code][i].first )
++i;
if( i == myhash[code].size() ){
myhash[code].push_back({x, 1});
++k;
}
else
++myhash[code][i].second;
}
void erase_hash( unsigned int x ){
unsigned int i = 0, code = x % MOD;
while( i < myhash[code].size() && x != myhash[code][i].first )
++i;
if( i < myhash[code].size() ){
--myhash[code][i].second;
if( !myhash[code][i].second ){
myhash[code].erase(myhash[code].begin() + i);
--k;
}
}
}
bool search_hash( unsigned int x ){
unsigned int i = 0, code = x % MOD;
while( i < myhash[code].size() && x != myhash[code][i].first )
++i;
return i < myhash[code].size();
}
void reset(){
unsigned int i;
i = k = 0;
for( i = 0; i < MOD; ++i )
myhash[i].clear();
}
long long solve( unsigned int n, unsigned int x ){
reset();
unsigned int st, dr;
long long rez = 0;
st = dr = 1;
while( st <= n ){
while( dr <= n && k + (1 - search_hash(v[dr])) <= x )
add_hash(v[dr++]);
erase_hash(v[st++]);
rez += 1LL * (dr - st + 1);
}
return rez;
}
int main() {
int n, l, u, i;
FILE *fin, *fout;
fin = fopen( "secv5.in", "r" );
fout = fopen( "secv5.out", "w" );
fscanf( fin, "%d%d%d", &n, &l, &u );
for( i = 1; i <= n; ++i )
fscanf( fin, "%u", &v[i] );
fprintf( fout, "%I64d", solve(n, u) - solve(n, l - 1) );
fclose( fin );
fclose( fout );
return 0;
}