Pagini recente » Cod sursa (job #73748) | Cod sursa (job #1439937) | Cod sursa (job #2248426) | Cod sursa (job #1249610) | Cod sursa (job #2349660)
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
FILE * fin = fopen("secv5.in", "r");
FILE * fout = fopen("secv5.out", "w");
const int DIM = (1<<20) + 5;
int N, V[DIM], f[DIM], st, dr, mid, L, U, Norm[DIM], K, Nr, Ans;
int main(){
fscanf( fin, "%d%d%d", &N, &L, &U );
for( int i = 1; i <= N; i++ ){
fscanf( fin, "%d", &V[i] );
Norm[i] = V[i];
}
sort( Norm + 1, Norm + N + 1 );
for( int i = 1; i <= N; i++ )
if( Norm[i] != Norm[K] )
Norm[++K] = Norm[i];
for( int i = 1; i <= N; i++ ){
st = 1; dr = K;
while( st <= dr ){
mid = ( st + dr ) >> 1;
if( Norm[mid] < V[i] )
st = mid + 1;
else
dr = mid - 1;
}
V[i] = st;
}
st = 1;
for( int i = 1; i <= N; i++ ){
Nr += ( f[ V[i] ] == 0 );
f[ V[i] ]++;
while( Nr > U ){
f[ V[st] ]--;
Nr -= ( f[ V[st] ] == 0 );
st++;
}
Ans += i - st + 1;
}
st = 1; Nr = 0; L--;
memset( f, 0, sizeof(f) );
for( int i = 1; i <= N; i++ ){
Nr += ( f[ V[i] ] == 0 );
f[ V[i] ]++;
while( Nr > L ){
f[ V[st] ]--;
Nr -= ( f[ V[st] ] == 0 );
st++;
}
Ans -= (i - st + 1);
}
fprintf( fout, "%d\n", Ans );
return 0;
}