Pagini recente » Cod sursa (job #3226431) | Cod sursa (job #3181341) | Cod sursa (job #2553511) | Cod sursa (job #87090) | Cod sursa (job #2657598)
#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];
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) {
int p1, p2;
long long ans = 0;
reset();
for (p1 = 1, p2 = 1; p2 <= n; p2++) {
adauga(v[p2]);
while (k > x)
sterge(v[p1++]);
ans = ans + 1LL * (p2 - p1 + 1);
}
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;
}