Pagini recente » Cod sursa (job #1864403) | Cod sursa (job #1493624) | Cod sursa (job #2548328) | Cod sursa (job #737329) | Cod sursa (job #2657546)
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = (1 << 20);
const int MOD = 666013;
unsigned int v[NMAX + 2];
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( int n, int x ){
reset();
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++]);
if( k > l )
erase_hash(v[st++]);
rez = rez + 1LL * (dr - st + 1LL);
}
return rez;
}
int main() {
ifstream fin( "secv5.in" );
ofstream fout( "secv5.out" );
int n, l, u, i;
fin >> n >> l >> u;
for( i = 1; i <= n; ++i )
fin >> v[i];
fout << solve(n, u) - solve(n, l - 1);
return 0;
}