Pagini recente » Cod sursa (job #2618300) | Cod sursa (job #2125543) | Cod sursa (job #2126795) | Cod sursa (job #2285675) | Cod sursa (job #2660795)
//Mihai Priboi
#include <stdio.h>
#include <stdlib.h>
#define N_MAX 1 << 20
unsigned int f[N_MAX], v[N_MAX], n;
void quicksort( int st, int dr ) {
int i, j, mij, aux;
mij = f[(st + dr) / 2];
i = st;
j = dr;
do {
while( i < dr && f[i] < mij ) i++;
while( j > st && f[j] > mij ) j--;
if( i <= j ) {
aux = f[i];
f[i] = f[j];
f[j] = aux;
i++;
j--;
}
} while( i <= j );
if( st < j ) quicksort( st, j );
if( i < dr ) quicksort( i, dr );
}
int cautbin( int x ) {
int r, pas;
pas = N_MAX;
r = 0;
while( pas ) {
if( r + pas < n && f[r + pas] <= x )
r += pas;
pas /= 2;
}
return r;
}
long long solve( int x ) {
int st, dr, i, cnt;
long long sum;
for( i = 0; i < N_MAX; i++ )
f[i] = 0;
sum = cnt = st = 0;
for( dr = 0; dr < n; dr++ ) {
if( f[v[dr]] == 0 ) {
while( st <= dr && cnt == x ) {
f[v[st]]--;
if( f[v[st]] == 0 )
cnt--;
st++;
}
}
if( f[v[dr]] == 0 )
cnt++;
f[v[dr]]++;
sum += (long long)dr - st + 1;
}
return sum;
}
int main() {
FILE *fin, *fout;
int l, u, i;
fin = fopen( "secv5.in", "r" );
fscanf( fin, "%d%d%d", &n, &l, &u );
for( i = 0; i < n; i++ ) {
fscanf( fin, "%u", &f[i] );
v[i] = f[i];
}
fclose( fin );
// normalizare
quicksort( 0, n - 1 );
for( i = 0; i < n; i++ )
v[i] = cautbin(v[i]);
//
fout = fopen( "secv5.out", "w" );
fprintf( fout, "%lld", solve(u) - solve(l - 1) );
fclose( fout );
return 0;
}