Pagini recente » Cod sursa (job #1366548) | Cod sursa (job #490958) | Cod sursa (job #2344131) | Cod sursa (job #1926010) | Cod sursa (job #2369158)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1100000;
const int MOD = 666013;
long long i, j, n, u, l, cnt, sol1, sol2 ;
long long v [ NMAX + 2 ] ;
struct elem {
long long val ;
long long frecv ;
};
vector <elem> has [ MOD + 1 ] ;
long long H(unsigned int x){
return x % MOD;
}
void add (long long x ) {
elem x2 ;
x2.val = x ;
x2.frecv = 1 ;
has[H(x)].push_back(x2) ;
}
void update (long long x) {
long long i = H(x) ;
vector <elem>::iterator j ;
for (j = has[i].begin() ; j != has[i].end() && (*j).val != x ; j++ ) ;
if (j != has[i].end() )
(*j) = {(*j).val, (*j).frecv+1 } ;
}
void delet (long long x ) {
long long i = H (x) ;
vector <elem>::iterator j ;
for (j = has[i].begin() ; j != has[i].end() && (*j).val != x ; j++ ) ;
if (j != has[i].end()){
if ((*j).frecv-1 == 0)
has[i].erase(j) ;
else
(*j) = {(*j).val, (*j).frecv-1 } ;
}
}
bool exist (long long x){
long long i = H (x) ;
vector <elem>::iterator j ;
for (j = has[i].begin() ; j != has[i].end() && (*j).val != x ; j++ );
if (j != has[i].end())
return true ;
return false ;
}
int main() {
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%lld%lld%lld", &n, &l, &u ) ;
for (i = 0 ; i < n ; i++ )
scanf("%lld", &v[i]) ;
i = 0; j = 0 ; cnt = 0 ; sol1 = 0 ;
while (j < n && i <= j ) {
if (exist(v[j]) == false ) {
if (cnt+1 <= u ) {
add (v[j]) ;
sol1 += (j - i + 1) ;
j++;
cnt++;
} else {
delet(v[i]) ;
if (exist(v[i]) == false )
cnt--;
i++;
}
} else {
update(v[j]) ;
sol1 += (j - i + 1) ;
j++;
}
}
while (i < j ) {
delet(v[i]) ;
i++;
}
i = 0 ; j = 0 ; cnt = 0 ; sol2 = 0 ;
while (j < n && i <= j ) {
if (exist(v[j]) == false ) {
if (cnt+1 < l ) {
add (v[j]) ;
sol2 += (j - i + 1 ) ;
j++;
cnt++;
} else {
delet(v[i]) ;
if (exist(v[i]) == false && cnt > 0 )
cnt--;
i++;
}
} else {
update(v[j]) ;
sol2 += (j - i + 1) ;
j++;
}
}
printf("%lld", sol1-sol2 ) ;
return 0;
}