Pagini recente » Cod sursa (job #2261718) | Cod sursa (job #461184) | Cod sursa (job #606494) | Cod sursa (job #1587641) | Cod sursa (job #2246374)
#include <iostream>
#include <stdio.h>
#include <vector>
#define MOD 666013
#define NMAX 1100000
using namespace std;
struct elem {
int val ;
int frecv ;
};
vector <elem> has [ MOD + 1 ] ;
int v [ NMAX + 2 ] ;
int H (int x ) { return x % MOD ; }
void add (int x ) {
elem x2 ;
x2.val = x ;
x2.frecv = 1 ;
has[H(x)].push_back(x2) ;
}
void update (int x) {
int 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 (int x ) {
int 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 (int x) { /// daca exista x cu restul i
int 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() {
FILE *fin, *fout ;
fin = fopen ("secv5.in", "r" ) ;
fout = fopen ("secv5.out", "w" ) ;
int i, j, n, u, l, count, sol1, sol2 ;
fscanf (fin, "%d%d%d", &n, &l, &u ) ;
for (i = 0 ; i < n ; i++ )
fscanf (fin, "%d", &v[i] ) ;
i = 0 ;
j = 1 ;
add (v[0]) ;
count = 1 ;
sol1 = 0 ;
while (j < n ) {
if (exist(v[j]) == false ) {
if (count+1 <= u ) {
add (v[j]) ;
sol1 += (j - i ) ;
j++;
count++;
}
else {
delet(v[i]) ;
if (exist(v[i]) == false )
count--;
i++;
}
}
else {
update(v[j]) ;
sol1 += (j - i ) ;
j++;
}
}
while (i < j ) {
delet(v[i]) ;
i++;
}
i = 0 ;
j = 1 ;
add (v[0]) ;
count = 1 ;
sol2 = 0 ;
while (j < n ) {
if (exist(v[j]) == false ) {
if (count+1 < l ) {
add (v[j]) ;
sol2 += (j - i ) ;
j++;
count++;
}
else {
delet(v[i]) ;
if (exist(v[i]) == false )
count--;
i++;
}
}
else {
update(v[j]) ;
sol2 += (j - i ) ;
j++;
}
}
fprintf (fout, "%d", sol1-sol2 ) ;
return 0;
}