Pagini recente » Cod sursa (job #2613465) | Cod sursa (job #2786863) | Cod sursa (job #2668174) | Cod sursa (job #2530289) | Cod sursa (job #2657601)
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;
#define MOD 666013
#define N 1048576
ifstream cin( "secv5.in" );
ofstream cout( "secv5.out" );
vector < pair<unsigned int, unsigned int> > myHash[MOD];
unsigned int v[N];
unsigned int k;
void adauga( int x ) {
unsigned int cod = x % MOD;
unsigned int i = 0;
while ( i < myHash[cod].size() && x != myHash[cod][i].first )
i++;
if ( i == myHash[cod].size() ) {
myHash[cod].push_back({x, 1});
k++;
}
else
myHash[cod][i].second++;
}
void sterge ( int x ) {
unsigned int cod = x % MOD;
unsigned int i = 0;
while ( i < myHash[cod].size() && x != myHash[cod][i].first )
i++;
if ( i < myHash[cod].size() ) {
if ( myHash[cod][i].second > 1 )
myHash[cod][i].second--;
else {
myHash[cod].erase( myHash[cod].begin() + i );
k--;
}
}
}
bool cauta ( int x ) {
unsigned int cod = x % MOD;
unsigned int i = 0;
while ( i < myHash[cod].size() && x != myHash[cod][i].first )
i++;
return i < myHash[cod].size();
}
void reset () {
unsigned int 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 ans = 0;
st = dr = 1;
while ( dr <= n ) {
adauga( v[dr] );
while ( k > x )
sterge( v[st++] );
ans += 1LL * ( dr - st + 1 );
dr++;
}
return ans;
}
int main() {
int n, i, l, u;
cin >> n >> l >> u;
for ( i = 1; i <= n; i++ ) {
cin >> v[i];
}
cout << solve( n, u ) - solve ( n, l - 1 );
return 0;
}